JNI之数组简单操作

NDK  代码片段  2023年7月26日 am8:08发布1年前 (2023)更新 城堡大人
86 0 0

前言

简单记录一下JNI数组操作。

正文

public class Hello {
    static {
        System.loadLibrary("Hello");
    }
    // JNI中对数组排序
    public static native int[] sortInt(int [] buffer);
    // JNI创建数组
    public static native int [] newIntArray();
}

还在在之前的基础改,这里只附上部分代码

JNINativeMethod method_table[] = {
        {"sortInt", "([I)[I", (void *) native_sort_int},
        {"newIntArray", "()[I", (void *) native_new_Int_Array},
};

sortInt

JNIEXPORT jintArray
JNICALL native_sort_int(JNIEnv *env, jclass jclazz, jintArray buffer) {
    //获取Java数组长度
    int length = env->GetArrayLength(buffer);
    LOGD("native_sort_int length : %d", length);
    //转换为指针
    int *arrayP = env->GetIntArrayElements(buffer, NULL);
    int i = 0;
    int j = 0;
    int temp = 0;
    //排序从大到小
    for (i = 0; i < length - 1; i++) {
        for (j = i + 1; j < length; j++) {
            if (arrayP[i] < arrayP[j]) {
                temp = arrayP[i];
                arrayP[i] = arrayP[j];
                arrayP[j] = temp;
            }
        }
    }
    //转化为jintArray
    //env->SetIntArrayRegion(buffer, 0, length, arrayP);
    //把修改写回原数组并且释放本地数组
    env->ReleaseIntArrayElements(buffer, arrayP, 0);
    return buffer;
}

newIntArray

JNIEXPORT jintArray
JNICALL native_new_Int_Array(JNIEnv *env, jclass jclazz) {
    int num = 10;
    // 1. 创建一个Java的int数组
    jintArray array = env->NewIntArray(num);
    // 2. 获取数组指针
    jint *arrayP = env->GetIntArrayElements(array, NULL);
    // 3. 初始化
    int i = 0;
    for (; i < num; i++) {
        arrayP[i] = i;
    }
    // 4. 把修改写回原数组并且释放本地数组
    env->ReleaseIntArrayElements(array, arrayP, 0);
    return array;
}

参考文章

  1. NDK/JNI 中Java和C/C++互相传递数组

  2. JNI基本类型数组操作

  3. JNI之函数介绍四之数组操作

 历史上的今天

  1. 2021: 刘年:写给儿子刘云帆(0条评论)
  2. 2019: 刘瑜:适应孤独,就像适应一种残疾(0条评论)
  3. 2018: Android的5个进程等级(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Launcher2导入Eclipse

在分析源码中,除了使用Source Insight 这个强大的软件外,有些应用还是用编译器看源码是最好的,因此今天我们学习一下如何导入源码到Eclipse中。这里主要是讲正确把Android 6.0 的Launcher2 导入Eclipse中并运行和安装应用。工具: Eclipse,L...

左右:父亲节

每年这个时候父亲疯了似的像找到了树立威严的绝好机会憋了半年的话全倒出来短信里他批评我怎样不对教育我怎样做人做事而我只能默默听着

interface_cast简介

前言interface_cast在Android Framework中很常见,虽然记得住,但也容易忘记,因此记录一下,方便自己查阅。正文这里以IServiceManager.cpp为例。IServiceManager.cpp目录:\frameworks\native\libs\binde...

HandlerThread的使用

HandlerThread简介HandlerThread是一个Android已封装好的轻量级的异步类。HandlerThread 继承Thread,本质就是个Thread,与普通Thread 的区别在于实现了自己的Looper,可以单独分发和处理消息。作用:用来线程间的消息传递,主要是子线...

jaudiotagger解析ID3第四版

前言前面介绍过《jaudiotagger解析ID3第三版》,然后后面又继续优化。当然,效果跟第三版差不多,但个人觉得写法更好,记录于此,方便自己查阅。阅读jaudiotagger源码进行对之前的代码优化。正文导入jaudiotagger.jar导入lib库/libs/jaudiotag...

TextView走马灯重复走问题

前言之前文章有介绍过走马灯相关内容,比如自定义TextView使得一直走马灯《Android中走马灯(或跑马灯)以及相关问题总结 -笔友城堡 - 阅读是一种生活方式 ()》等。记录一下TextView走马灯时为啥会出现重头开始(或者说抖动)问题以及彻底解决办法。PS:《自定义View:Bi...