日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Java: JNI对数组赋值并返回给Java

發布時間:2024/8/24 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。