1、基本类型应用
对于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、基本数据类型的数组应用
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; }
3、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; }
时间: 2024-11-05 11:28:14