美文网首页
JNI--数组的访问

JNI--数组的访问

作者: aruba | 来源:发表于2020-04-08 14:45 被阅读0次

    今天来使用JNI对数组操作,数组分为基本类型数组和引用类型数组,首先来看下基本类型数组的使用

    1.基本类型数组

    我们在java中定义一个方法,传入一个int型数组,使用c++进行排序
    package com.aruba.jniapplication;
    
    /**
     * JNI访问数组
     */
    public class JniDemo4 {
    
        static {
            System.load("C:\\Users\\tyqhc\\source\\repos\\JniApplication\\x64\\Debug\\JniApplication.dll");
        }
    
        public native void sortIntArray(int[] arry);
    
        public static void main(String[] args) {
            JniDemo4 jniDemo4 = new JniDemo4();
            int[] arry = {3, 70, 43, 4, 62, 10};
            jniDemo4.sortIntArray(arry);
            for (int i = 0; i < arry.length; i++) {
                System.out.println(arry[i]);
            }
        }
    
    }
    
    
    c++中使用sort方法,需要先引入头文件<algorithm>
    //访问基本类型数据数组
    JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo4_sortIntArray
    (JNIEnv* env, jobject jobj, jintArray arry) {
        //将java的int数组转化为c++的int数组
        const int size = env->GetArrayLength(arry);
        jint* c_arry = env->GetIntArrayElements(arry,NULL);
    
        sort(c_arry,c_arry+size);
    
        //通知JVM可以释放,并将修改的数据重新写回原来的内存
        env->ReleaseIntArrayElements(arry, c_arry, JNI_COMMIT);
    }
    
    默认升序排列,可以自定义方法实现降序排列
    //为true,则不交换
    bool compare(int a, int b){
        return a > b; //降序排列,如果改为return a<b,则为升序
    }
    
    //访问基本类型数据数组
    JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo4_sortIntArray
    (JNIEnv* env, jobject jobj, jintArray arry) {
        //将java的int数组转化为c++的int数组
        const int size = env->GetArrayLength(arry);
        jint* c_arry = env->GetIntArrayElements(arry,NULL);
    
        sort(c_arry,c_arry+size,compare);
    
        //通知JVM可以释放,并将修改的数据重新写回原来的内存
        env->ReleaseIntArrayElements(arry, c_arry, JNI_COMMIT);
    }
    
    执行java代码:

    2.引用类型数组

    在java中定义一个native方法,用来获取一个String数组
        public native String[] getArrayByC(int size);
    
    编写相应的C++代码,获取一个size大小的字符串数组,并进行赋值后返回出去
    JNIEXPORT jobjectArray JNICALL Java_com_aruba_jniapplication_JniDemo4_getArrayByC
    (JNIEnv*, jobject);
    
    //访问引用类型数据数组
    JNIEXPORT jobjectArray JNICALL Java_com_aruba_jniapplication_JniDemo4_getArrayByC
    (JNIEnv* env, jobject jobj, jint size) {
        //创建需要返回的jobjectArray
        jobjectArray result;
        jclass string_clz = env->FindClass("java/lang/String");
        if (string_clz == 0) {
            return 0;
        }
        //三个参数:1:数组大小 2:数组的jclass 3:调用该方法的jobject
        result = env->NewObjectArray(size, string_clz, jobj);
        if (result == 0) {
            return 0;
        }
    
        //往数组里塞数据
        for (int i = 0; i < size; i++) {
            char  *str = (char *)malloc(55);
            memset(str,0, 55);
            sprintf(str, "hello by c++ %d", i);
            jstring string_val = env->NewStringUTF(str);
            env->SetObjectArrayElement(result,i,string_val);
            free(str);
        }
    
        return result;
    }
    
    执行java代码:

    相关文章

      网友评论

          本文标题:JNI--数组的访问

          本文链接:https://www.haomeiwen.com/subject/yebzphtx.html