一、基本類型應用
對於JNI處理基本類型仍是比較簡單的,下面是Java代碼:
<span style="font-size:14px;"> public native int intMethod(int n);
public native boolean booleanMethod(boolean bool);</span>
上面的方法是在Java中寫的,注意要加native關鍵字,這兩個方法都比較簡單,分別傳入int ,boolean類型到jni中,通過處理返回。下面是jni的代碼:
<span style="font-size:14px;">JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intMethod(
JNIEnv * env, jobject obj, jint val) {
return val * val;
}
JNIEXPORT jboolean JNICALL Java_com_example_jniandroid_service_SimpleObject_booleanMethod(
JNIEnv * env, jobject obj, jboolean val) {
return !val;
}</span>
二、基本數據類型的數組應用
2.1 c處理Java的int[],並返回該數組元素的總和。
public native int intArrayMethod(int[] intArray);
/**
* 求數組的和,返回一個int類型
*/
JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intArrayMethod(
JNIEnv * env, jobject obj, jintArray array) {
int i, sum = 0;
//獲取數組的長度
jsize len = (*env)->GetArrayLength(env, array);
//取得數組首地址的指針
jint *body = (*env)->GetIntArrayElements(env, array, 0);
for (i = 0; i < len; i++) {
//獲取數組中的元素
sum += body[i];
}
//釋放資源
(*env)->ReleaseIntArrayElements(env, array, body, 0);
LOGD("數組總和 =%d", sum);
return sum;
}
2.2 native方法返回一個int[].
public native int[] receiverIntArray();
對應的c簽名
/**
* 返回Java的int[]類型
*/
JNIEXPORT jintArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverIntArray(
JNIEnv * env, jobject obj) {
int i = 1;
jintArray array; //定義數組對象
array = (*env)->NewIntArray(env, 10);
for (; i <= 10; i++) {
//void SetIntArrayRegion(jintArray array, jsize start, jsize len,const jint *buf)// len:爲1
(*env)->SetIntArrayRegion(env, array, i - 1, 1, &i);
}
/* 獲取數組對象的元素個數 */
int len = (*env)->GetArrayLength(env, array);
/* 獲取數組中的全部元素 */
jint* elems = (*env)->GetIntArrayElements(env, array, 0);
for (i = 0; i < len; i++) {
LOGD("ELEMENT %d IS %d\n", i, elems[i]);
}
return array;
}
三、JNI處理string類型和String數組
public native String stringMethod(String text);
public native String[] receiverStringArray(String val);
下面是jni的實現,在c文件的前面聲明數組長度 #define ARRAY_LENGTH 5 。第一個方法是將一個字符串中的每一個字符轉換成大寫,第二方法返回一個String類型的數組。這裏用到了FindClass方法,它主要根據類的包名找到該類的class,在經過new方法建立對象。
JNIEXPORT jstring JNICALL Java_com_example_jniandroid_service_SimpleObject_stringMethod(
JNIEnv * env, jobject obj, jstring string) {
const char *str = (*env)->GetStringUTFChars(env, string, 0);
char cap[128];
//copy字符串
strcpy(cap, str);
(*env)->ReleaseStringUTFChars(env, string, str);
int i = 0;
for (i = 0; i < strlen(cap); i++) {
//轉換成大寫
*(cap + i) = (char) toupper(*(cap + i));
}
return (*env)->NewStringUTF(env, cap);
}
/**
* 返回Java字符串數組
*/
JNIEXPORT jobjectArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverStringArray(
JNIEnv * env, jobject obj, jstring val) {
//FindClass找到Java中String這個類,返回jni的jclass對象
jclass objClass = (*env)->FindClass(env, "java/lang/String");
//NewObjectArray建立對象數組,第二個參數長度,第三個類型
jobjectArray texts = (*env)->NewObjectArray(env, (jsize) ARRAY_LENGTH,objClass, 0);
jstring jstr;
char* sa[] = { "Hello,", "world", "jni", "iii", "愛死你了" };
int i = 0;
for (; i < ARRAY_LENGTH; i++) {
//建立jstring並賦值,NewStringUTF()函數將C語言的字符串轉換爲jstring類型
jstr = (*env)->NewStringUTF(env, sa[i]);
//賦值
(*env)->SetObjectArrayElement(env, texts, i, jstr); //必須放入jstring
}
return texts;
}