JNI--数组的访问

2020-04-08  本文已影响0人  aruba

今天来使用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代码:
上一篇下一篇

猜你喜欢

热点阅读