您的位置:首页 > 编程语言 > Java开发

JNI对数组赋值排序,创建数组并返回给Java

2018-01-17 13:10 441 查看


创建两个native方法

//传递数组,操作后,返回
public native void passArrayMethod(int[] arr);

//创建指定长度数组
public native int[] createArrayMethod(int len);
1
2
3
4
5


生成对应的c函数

JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_passArrayMethod
(JNIEnv *, jobject, jintArray);

JNIEXPORT jintArray JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_createArrayMethod
(JNIEnv *, jobject, jint);
1
2
3
4
5


传递数组给JNI,修改第一个元素值,然后排序

int com(const void *a, const void *b){
return *(int *)a - *(int *)b;//升序
}
JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_passArrayMethod
(JNIEnv *env, jobject jobj, jintArray jarr){
//1.获取数组指针
jint *arr = env->GetIntArrayElements(jarr, NULL);
*arr = 100;
//2.获取数组长度
int len = env->GetArrayLength(jarr);
//3.排序
qsort(arr, len, sizeof(jint), com);

//4.释放资源
env->ReleaseIntArrayElements(jarr, arr, JNI_COMMIT);
//    env->ReleaseIntArrayElements(jarr, arr, JNI_ABORT);
//  对于最后一个参数(如果指针指向的数组为副本时,否则该参数不起作用)
//      0       copy back the content and free the elems buffer
//      JNI_COMMIT      copy back the content but do not free the elems buffer
//      JNI_ABORT       free the buffer without copying back the possible changes
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


JNI生成数组,并返回

JNIEXPORT jintArray JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_createArrayMethod
(JNIEnv *env, jobject jobj, jint len){
//1.新建长度len数组
jintArray jarr = env->NewIntArray(len);
//2.获取数组指针
jint *arr = env->GetIntArrayElements(jarr, NULL);
//3.赋值
int i = 0;
for(; i < len; i++){
arr[i] = i;
}
//4.释放资源
env->ReleaseIntArrayElements(jarr, arr, 0);
//5.返回数组
return jarr;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


MainActivity中调用

int[] arr = {1, 3, 2, 6, 8, 0};
Log.i(TAG, "arr修改前: " + getArrayString(arr));
jd.passArrayMethod(arr);
Log.i(TAG, "arr修改后: " + getArrayString(arr));

Log.i(TAG, "------------------------------------------");

int[] arr_new = jd.createArrayMethod(10);
Log.i(TAG, "arr_new: "+ getArrayString(arr_new) );
1
2
3
4
5
6
7
8
9


输出结果:

09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr修改前: ,1,3,2,6,8,0
09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr修改后: ,0,2,3,6,8,100
09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: ------------------------------------------
09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr_new: ,0,1,2,3,4,5,6,7,8,9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: