前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JNI--数组的访问

JNI--数组的访问

作者头像
aruba
发布2020-07-02 17:15:17
9900
发布2020-07-02 17:15:17
举报
文章被收录于专栏:android技术android技术
今天来使用JNI对数组操作,数组分为基本类型数组和引用类型数组,首先来看下基本类型数组的使用
1.基本类型数组
我们在java中定义一个方法,传入一个int型数组,使用c++进行排序
代码语言:javascript
复制
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>
代码语言:javascript
复制
//访问基本类型数据数组
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);
}
默认升序排列,可以自定义方法实现降序排列
代码语言:javascript
复制
//为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数组
代码语言:javascript
复制
    public native String[] getArrayByC(int size);
编写相应的C++代码,获取一个size大小的字符串数组,并进行赋值后返回出去
代码语言:javascript
复制
JNIEXPORT jobjectArray JNICALL Java_com_aruba_jniapplication_JniDemo4_getArrayByC
(JNIEnv*, jobject);
代码语言:javascript
复制
//访问引用类型数据数组
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代码:
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 今天来使用JNI对数组操作,数组分为基本类型数组和引用类型数组,首先来看下基本类型数组的使用
  • 1.基本类型数组
    • 我们在java中定义一个方法,传入一个int型数组,使用c++进行排序
      • c++中使用sort方法,需要先引入头文件<algorithm>
        • 默认升序排列,可以自定义方法实现降序排列
          • 执行java代码:
          • 2.引用类型数组
            • 在java中定义一个native方法,用来获取一个String数组
              • 编写相应的C++代码,获取一个size大小的字符串数组,并进行赋值后返回出去
                • 执行java代码:
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档