Java: JNI对数组赋值并返回给Java
生活随笔
收集整理的這篇文章主要介紹了
Java: JNI对数组赋值并返回给Java
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在JNI中對java層的數組賦值有兩種方式:一是在java層創建好數組,然后傳遞到JNI層,由JNI層進行賦值;二是直接在JNI層創建好數組并賦值,然后返回數組到Java層。下面是兩種方式的對比實現:
創建兩個native方法
//傳遞數組,操作后,返回
public native void passArrayMethod(int[] arr);
//創建指定長度數組
public native int[] createArrayMethod(int len);
生成對應的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);
傳遞數組給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
};
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;
};
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) );
輸出結果:
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
參考鏈接:
1.JNI對數組賦值排序,創建數組并返回給Java
總結
以上是生活随笔為你收集整理的Java: JNI对数组赋值并返回给Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 母螃蟹为什么女的吃?
- 下一篇: 子网划分详解