JNI之路径初探---5

简介: 本篇文章讲解JNI接收处理完从Java层传递的数据后内存的同步问题。从JAVA层传递数据给C排序数组排序及内存同步qsort是一个C语言的排序函数,这不是我们讨论的重点,jint * (JNICALL *GetIntAr...

本篇文章讲解JNI接收处理完从Java层传递的数据后内存的同步问题。

从JAVA层传递数据给C排序
数组排序及内存同步

qsort是一个C语言的排序函数,这不是我们讨论的重点,
jint * (JNICALL *GetIntArrayElements)
(JNIEnv *env, jintArray array, jboolean *isCopy);
这个函数的作用是得到一个jni数组元素的指针,jintarray里面的每一个元素都是jint类型,数组的特性就是第一个元素的地址就是它的指针,根据元素类型就可以往下得到所有元素,这个函数的第三元素是一个jboolean类型的指针,它的含义就是说如果我现在在C语言层处理这个数组,它要不要复制,不复制代表处理的是和JAVA同一个内存即数组,这里官方建议填NULL,那么数组排序后,操作的也是同一块内存为什么还要去同步一下呢?这里我打印了一下他们的地址,发现不同,由此可以得出NULL和JNI_TRUE都会复制内存,如果有兴趣的同学可以试一下JNI_FALUSE,这个参数同样还是复制了,而填入JNI_TURE后再同步内存会提示JVM运行时的异常,所以不管是哪一个参数其实都不是操作同一块内存,最后如果要在JAVA层去处理结果一定要同步一下内存。

相关文章
|
9月前
|
C++ Windows
C++ --- Dll文件的生成与调用(一)
C++ --- Dll文件的生成与调用(一)
246 0
|
10月前
|
C++
Clion配置单个project下可以运行多个CPP文件的main函数
Clion配置单个project下可以运行多个CPP文件的main函数
710 0
|
Java Linux
JNI:需要显式指定使用jar的全路径
JNI:需要显式指定使用jar的全路径
57 0
JNI中访问JList的代码
JNI中访问JList的代码
50 0
|
Java 开发工具 Android开发
Android Studio运行报错:无法访问XXX......请删除该文件或确保该文件位于正确的类路径子目录中
今天运行一个项目发现运行不起来了,报错 错误: 无法访问XXX 错误的类文件: C:\Users\xxx\.gradle\caches\transforms-2\files-2.1\xxx\xxx(xxx/xxx/xxx.class) 错误的 RuntimeInvisibleParameterAnnotations 属性: xxxx 请删除该文件或确保该文件位于正确的类路径子目录中。
1020 0
|
Java
classPath 【项目编译之后的输出路径】字节码的路径,默认是生成在bin目录下
classPath 【项目编译之后的输出路径】字节码的路径,默认是生成在bin目录下
148 0
classPath 【项目编译之后的输出路径】字节码的路径,默认是生成在bin目录下
|
Java Android开发 Linux
在 Android 系统中直接调用 SO文件(包含System.loadLibrary加载so的路径解释)
Android虚拟机不能直接调用底层设备,如果要对底层设备进行调用,就需要用到so使用 C语言或C++编写完成,利用NDK进行编译,直接运行在Linux内核中,按jni调用 so时,基本类型可以直接交互。
7870 0