首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android JNI 数组操作

    在 Android JNI 基础知识篇提到了 Java 数组类型对应的 JNI 数组类型。...中返回一个基础数据类型的数组,对应的代码如下: // 从 Native 返回基本数据类型数组 private native int[] getIntArray(int num); 对应的...C++ 代码如下: /** * 从 Native 返回 int 数组,主要调用 setArrayRegion 来填充数据,其他数据类型类似操作 */ extern "C" JNIEXPORT...例如在 JNI 中创建一个二维的整型数组并返回: // 从 Native 返回二维整型数组,相当于是一个一维整型数组,数组中的每一项内容又是数组 private native int[]...具体 C++ 代码如下: /** * 从 Native 返回一个二维的整型数组 */ extern "C" JNIEXPORT jobjectArray JNICALL Java_com_glumes_cppso_jnioperations_ArrayTypeOps_getTwoDimensionalArray

    1.4K40

    【Android NDK 开发】JNI 方法解析 ( int 数组传递 | jintArray 类型 | 数组转换 | 获取数组长度 | 获取数组元素 | 指针遍历数组 | 数组返回值设置 )

    GetIntArrayElements 函数作用 : 将 Java 环境的 int 数组类型变量 ( jintArray 类型 ) , 转为 C/C++ 环境中的 jint 数组指针 , 返回一个指针指向...; ② 将 该参数设置成指向 JNI_FALSE 的指针 : 直接使用 java 中的 int 数组地址 , 返回 java 中的 int 数组的首地址 ; ③ 将 该参数设置成 NULL ( 推荐...: 刷新 Java 数组 , 不释放 C/C ++ 数组 ③ 模式 2 ( JNI_ABORT ) : 不刷新 Java 数组 , 释放 C/C++ 数组 下面是 jni.h 中的定义的模式 : #...from C++"; // 返回 jstring 类型的字符串 // 将 C/C++ 的 char* 字符串转为 Java 中的 jstring 类型字符串 return...数组 , 释放 C/C++ 数组 模式 1 ( JNI_COMMIT ) : 刷新 Java 数组 , 不释放 C/C ++ 数组 模式 2 ( JNI_ABORT

    2.1K10

    【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )

    C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ....C/C++ 中的 Java 字符串数组类型 ---- JNI 中 C/C++ 代码里的 Java 字符串数组类型 : jobjectArray ; ① JNI 类型现状 : 在 JNI 中没有定义 Java..., Java 中字符串也是 Object 类型的 ; ③ 字符串数组类型 : 因此在 C/C++ 环境中使用 对象数组 jobjectArray 来当做 字符串数组类型 ; II ....获取字符串数组元素 ---- C/C++ 代码中获取指定索引的 Java 字符串数组类型的元素 ; 1 ....的指针 : 将 int 数组数据拷贝到一个新的内存空间中 , 并将该内存空间首地址返回 ; ② 将 该参数设置成指向 JNI_FALSE 的指针 : 直接使用 java 中的 int 数组地址 , 返回

    1.4K20

    JNI 从入门到实践,万字爆肝详解!

    从 Java 调用 Native 或从 Native 调用 Java 的成本很高,使用 JNI 时要限制跨越 JNI 边界的调用次数; 问题 2 - 引用类型数据的回收: 由于引用类型数据(例如字符串...每一个从 Java 调用的 native 方法,在 JNI 函数中都会传递一个当前对象的引用。...数组的数据回写到 Java 数组,并释放 C/C++ 数组 JNI_COMMIT 将 C/C++ 数组的数据回写到 Java 数组,并不释放 C/C++ 数组 JNI_ABORT 不回写数据,但释放...操作引用类型数组(jobjectArray): 1、将 Java 引用类型数组转换为 C/C++ 数组: 不支持!...而 JNI 层作为 Java 层和 C/C++ 层之间的桥接层,那么它就会兼具两者的特点:对于 局部 Java 对象引用: 在 JNI 层可以通过 NewObject 等函数创建 Java 对象,并且返回对象的引用

    2.4K21

    Android NDK开发入门

    官方示例 默认创建Android NDK工程时,Android提供了一个简单的JNI交互示例,返回一个字符串给Java层,方法名的格式为:Java_包名_类名_方法名 。...如果是JNI_FALSE则返回JVM内部源字符串的指针,意味着可以在native层修改源字符串,但是不推荐修改,因为Java字符串的原则是不能修改的。...GetIntArrayElements的第二个参数一般传NULL,传递JNI_TRUE是返回临时缓冲区数组指针(即拷贝一个副本),传递JNI_FALSE则是返回原始数组指针。...操作对象数组稍显复杂,下面举一个例子:在native层创建一个二维数组,且赋值并返回给Java层使用。...从classpath路径下搜索MyJNIClass这个类,并返回该类的Class对象 jclass clazz = env->FindClass("com/xzh/jni/jni/MyJNIClass

    1.7K50

    【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    ); ② 参数列表说明 : JavaVM* vm : 表示 Java 虚拟机 ; void* reserved : 一般是 NULL ; ③ 返回值说明 : 返回当前 NDK 使用的 JNI 版本 ;...结构体定义 : 该结构体定义了 C/C++ 方法 与 Java 方法的映射 ; ① const char* name : Java 中定义的 Native 方法名 , 注意这是一个 C 字符串 ② const...JNINativeMethod methods[] 数组 : 该数组是 JNI 方法动态注册的参数 , 每个结构体表示了本地方法 与 Java 层方法的映射 ; 数组中有几个元素 , 那么就映射了几个方法...JavaVM 获取 JNIEnv ( GetEnv ) ---- 函数原型 : 从 Java 虚拟机 ( JavaVM ) 中获取 JNI 运行环境 ( JNIEnv ) ; ① 参数说明 : void...返回值说明 : int 类型返回值代表了当前 NDK 使用的 JNI 版本 JNI 版本 中可选的有四个值 , 但是只能选择返回后三个 JNI_VERSION_1_2

    1K20

    深入探索JNI:基础、最佳实践、性能优化与安全策略

    Java中的字符串是java.lang.String对象,而C/C++通常使用字符数组(C风格字符串)来处理文本。...1.3 小结 下面表格总结了上述文本中提到的基本类型用法及其在 JNI 中的数据传递机制: 这个表格展示了如何在 JNI 中处理从 Java 到本地代码的数据类型转换,包括基本数据类型、字符串、数组和对象...在JNI中,正确的内存管理是至关重要的。例如,当你从Java传递一个大型数组到本地代码进行处理时,可能会使用GetPrimitiveArrayCritical函数来获取直接访问数组元素的权限。...正确的做法是在本地代码中检查潜在错误,并通过JNI接口抛出Java异常,让Java层能够捕获并处理。 例如,如果本地方法发现无法打开指定的文件,它应该抛出一个IOException给Java层。...示例: 如果本地方法未对从Java传递的数组长度进行验证,就直接使用该长度进行内存访问,可能会导致缓冲区溢出。

    61720

    Android JNI 基础知识

    在 Android 上进行 NDK 开发还是得先学会 JNI 相关技能,先可以从 Java 层到 C/C++ 层的相互调用,然后再学习 NDK 开发的那些技巧。...层的参数,并转换成 C++ 层的数据类型,计算之后再返回成 Java 层的数据类型。...jthrowable 可以看到,除了 Java 中基本数据类型的数组、Class、String 和 Throwable 外,其余所有 Java 对象的数据类型在 JNI 中都用 jobject...而对于 String 类型,必须要使用合适的 JNI 函数来将 jstring 转变成 C/C++ 字符串。 对于下面的 Native 方法,传入一个字符串,并要求返回一个字符串。...如果为JNI_TRUE 则返回拷贝,并且要为产生的字符串拷贝分配内存空间;如果为JNI_FALSE 就直接返回了 JVM 源字符串的指针,意味着可以通过指针修改源字符串的内容,但这就违反了 Java 中字符串不能修改的规定

    1.6K30

    Android JNI(一)——NDK与JNI基础

    oracle中关于JNI的指导 Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNI。JNI就是Java调用C++的规范。...即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。...env是JNI接口指针;unicodeChars是指向Unicode字符串的指针;len是Unicode字符串的长度。返回值是Java字符串对象,如果无法构造该字符串,则为null。...Java基本类型的数组 方法 返回值 NewArray Routines Array Type NewBooleanArray() jbooleanArray NewByteArray...(属性、方法),完全不用管JVM内部是怎么实现的,如何为新建的对象申请内存,使用完之后如何释放内存,只需要知道有个垃圾回收器在处理这些事情就行了,然而,从Java虚拟机创建的对象传到C/C++代码就会产生引用

    3.7K32

    JNI的探索

    [] jTypeArray; byte[] jByteArray; 引用类型数组 Object jobjectArray; JNI对应的java属性与方法签名 在jni调用中,返回值和参数,以及静态字段和实例字段...类的构造方法,等于在C++里面创建一个java对象,然后进行调用;同样也是采用GetMethodID的方法进行获取构造函数的id,然后由NewObject 进行对象的创建 JNI数组的使用 java代码...NewStringUTF(c_str); if (str == NULL) { return NULL; } // 将jstring 赋值给数组...); 二维数组的创建 处理中文字符串的乱码问题 由于java的字符串编码,和C或者C++的字符串编码不一样,所以在java传中文到C/C++会出现乱码的现象 ?...函数介绍: 1> ExceptionCheck:检查是否发生了异常,若有异常返回JNI_TRUE,否则返回JNI_FALSE 2> ExceptionOccurred:检查是否发生了异常,若用异常返回该异常的引用

    96920

    JNI 数据类型及Java与C++之间互调

    它允许运行在JVM上的Java代码能够与C/C++实现的本地库进行交互。 JNI 数据类型 Java中有两种类型:基本数据类型(int、float、char等)和引用类型(类、对象、数组等)。...JNI定义了一个C/C++类型的集合,集合中每一个类型对应于Java中的每一个类型,其中,对于基本类型而言,JNI与Java之间的映射是一对一的,比如Java中的int类型直接对应于C/C++中的jint...比如,对于java.lang.String对应的JNI类型是jstring,但本地代码只能通过GetStringUTFChars这样的JNI函数来访问字符串的内容。...函数解析 Java调用C/C++ 本地函数 /** * CPP 源文件,返回一个字符串 * @param env * @return */ Java_com_example_jnilearndemo_MainActivity_stringFromJNI...上面两个函数作用都是当Java层调用本地方法时向Java层返回一个UTF-8格式的字符串。两个函数使用方法不同原因:主要是因为这两个函数是在不同的源文件中实现的。

    2.2K10
    领券