安卓NDK開發案列一:字串的加密和解密
阿新 • • 發佈:2019-02-08
前言:通過此案例來加深一下我們對JNI字串的處理,當然字串的操作用java也可以完美解決,廢話不多說開始今天的擼程式碼!
--------分割線--------
ok,我們來看一下效果圖:
實現思路:
1.從edittext獲取字串。
2.將獲得的字串傳遞給jni
3.在jni進行字串的加密,然後返回。
4.在jni進行字串的解密,然後返回。
------------分割線-------
java程式碼:
MainActivity.java:
JNI.java:package com.fly.demo5; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private EditText et; private JNI jni; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et = (EditText) findViewById(R.id.et); jni = new JNI(); } public void encode(View view) { //獲取edittext的文字 String word = et.getText().toString(); //傳遞c加密處理 word = jni.encodeInC(word); //把處理後的結果顯示到edittext上 et.setText(word); } public void decode(View view) { //獲取edittext的文字 String word = et.getText().toString(); //傳遞c加密處理 word = jni.decodeInC(word); //把處理後的結果顯示到edittext上 et.setText(word); } }
package com.fly.demo5;
/**
* Created by Fly on 2017/7/6.
*/
public class JNI {
static {
System.loadLibrary("native-lib");
}
public native String encodeInC(String word);
public native String decodeInC(String word);
}
簡單的佈局:C程式碼:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.fly.demo5.MainActivity"> <EditText android:id="@+id/et" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="encode" android:text="加密" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="decode" android:text="解密" /> </LinearLayout> </LinearLayout>
--------完--------// // Created by Fly on 2017/7/6. // #include <jni.h> #include <stdlib.h> #include <stdio.h> /** * 把一個jstring轉換成一個c語言的char* 型別. */ char *_JString2CStr(JNIEnv *env, jstring jstr) { char *rtn = NULL; jclass clsstring = (*env)->FindClass(env, "java/lang/String"); jstring strencode = (*env)->NewStringUTF(env, "GB2312"); jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid, strencode); // String .getByte("GB2312"); jsize alen = (*env)->GetArrayLength(env, barr); jbyte *ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE); if (alen > 0) { rtn = (char *) malloc(alen + 1); //"\0" memcpy(rtn, ba, alen); rtn[alen] = 0; } (*env)->ReleaseByteArrayElements(env, barr, ba, 0); return rtn; } JNIEXPORT jstring JNICALL Java_com_fly_demo5_JNI_encodeInC (JNIEnv *env, jobject clazz, jstring jstr) { //把jstring型別字串轉化成 c能夠處理的char* 型別 char *cstr = _JString2CStr(env, jstr); int length = strlen(cstr); int i; for (i = 0; i < length; i++) { *(cstr + i) += 2; } return (*env)->NewStringUTF(env, cstr); } /* * Class: com_fly_demo5_JNI * Method: decodeInC * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_fly_demo5_JNI_decodeInC (JNIEnv *env, jobject clazz, jstring jstr) { char *cstr = _JString2CStr(env, jstr); int length = strlen(cstr); int i; for (i = 0; i < length; i++) { *(cstr + i) -= 2; } return (*env)->NewStringUTF(env, cstr); }