首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JNI参数是本地或全局引用

JNI 是 Java Native Interface 的缩写,即 Java 本地接口。它允许 Java 代码调用 C/C++ 代码,反之亦然。JNI 是 Java 和 C/C++ 代码之间的桥梁,使得这两种语言可以相互通信。

JNI 参数可以是本地引用或全局引用。本地引用是指 JNI 函数调用在本地方法栈中执行的 C/C++ 函数。全局引用是指 JNI 函数调用在 Java 代码中声明的全局 C/C++ 变量或函数。

在 JNI 中,参数传递的方式有两种:通过值传递和通过引用传递。通过值传递的方式是将参数复制一份,然后传递给函数。通过引用传递的方式是将参数直接传递给函数,函数可以修改参数的值,也可以修改参数的引用指向的对象。

JNI 提供了许多函数,用于将 Java 对象转换为 C/C++ 对象,或将 C/C++ 对象转换为 Java 对象。这些函数包括:

  • JNI_VERSION_1_8:用于设置 JNI 版本。
  • JNI_VERSION_1_6:用于设置 JNI 版本。
  • JNI_VERSION_1_4:用于设置 JNI 版本。
  • JNI_VERSION_1_2:用于设置 JNI 版本。
  • JNI_VERSION_1_1:用于设置 JNI 版本。
  • JNI_GetCreatedJavaVMs:用于获取已创建的 Java 虚拟机列表。
  • JNI_CreateJavaVM:用于创建 Java 虚拟机。
  • JNI_DeleteJavaVM:用于删除 Java 虚拟机。
  • JNI_GetJavaVMs:用于获取 Java 虚拟机列表。
  • JNI_GetDefaultJavaVMInitArgs:用于获取默认的 Java 虚拟机初始化参数。
  • JNI_CreateJavaVM_extended:用于创建 Java 虚拟机。
  • JNI_CreateJavaVM_extended_noinit:用于创建 Java 虚拟机。
  • JNI_GetCreatedJavaVMs_extended:用于获取已创建的 Java 虚拟机列表。
  • JNI_GetJavaVMs_extended:用于获取 Java 虚拟机列表。
  • JNI_GetDefaultJavaVMInitArgs_extended:用于获取默认的 Java 虚拟机初始化参数。
  • JNI_CreateJavaVM_extended_no_init:用于创建 Java 虚拟机。
  • JNI_CreateJavaVM_extended_with_init_args:用于创建 Java 虚拟机。
  • JNI_GetCreatedJavaVMs_extended_no_init:用于获取已创建的 Java 虚拟机列表。
  • JNI_GetJavaVMs_extended_no_init:用于获取 Java 虚拟机列表。
  • JNI_GetDefaultJavaVMInitArgs_extended_no_init:用于获取默认的 Java 虚拟机初始化参数。
  • JNI_CreateJavaVM_extended_with_init_args_no_init:用于创建 Java 虚拟机。
  • JNI_GetCreatedJavaVMs_extended_with_init_args:用于获取已创建的 Java 虚拟机列表。
  • JNI_GetJavaVMs_extended_with_init_args:用于获取 Java 虚拟机列表。
  • JNI_GetDefaultJavaVMInitArgs_extended_with_init_args:用于获取默认的 Java 虚拟机初始化参数。
  • JNI_CreateJavaVM_extended_with_init_args_no_init_or_return_val:用于创建 Java 虚拟机。
  • JNI_GetCreatedJavaVMs_extended_with_init_args_no_init_or_return_val:用于获取已创建的 Java 虚拟机列表。
  • JNI_GetJavaVMs_extended_with_init_args_no_init_or_return_val:用于获取 Java 虚拟机列表。
  • JNI_GetDefaultJavaVMInitArgs_extended_with_init_args_no_init_or_return_val:用于获取默认的 Java 虚拟机初始化参数。
  • JNI_CreateJavaVM_extended_with_init_args_no_init_return_val:用于创建 Java 虚拟机。
  • JNI_GetCreatedJavaVMs_extended_with_init_args_no_init_return_val:用于获取已创建的 Java 虚拟机列表。
  • JNI_GetJavaVMs_extended_with_init_args_no_init_return_val:用于获取 Java 虚拟机列表。
  • `JNIGetDefaultJavaVMInitArgs_extended_with_init_args_no_init
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JNI全局引用&局部引用&弱全局引用

这些引用JNI 中分为三种 全局引用 (Global Reference) 局部引用 (Local Reference) 弱全局引用 (Weak Global Reference), JDK 1.2...在局部引用的有效期中,可以传递到别的本地函数中,要强调的它的有效期仍然只在一次的Java本地函数调用中,所以千万不能用C++全局变量保存它或是把它定义为C++静态局部变量。 2....与局部引用不同,全局引用的创建不是由 JNI 自动创建的,全局引用需要调用 NewGlobalRef 函数,而释放它需要使用 ReleaseGlobalRef 函数。 3....这种引用全局引用一样可以在多个本地代码有效,也可以跨越多线程有效;不一样的,这种引用将不会阻止垃圾回收器回收这个引用所指向的对象。...当然,这些 jfieldID/jmethodID 定义在C/C++ 的全局。 使用这种方式还有好处,当Java类卸载或者重新加载的时候,也会重新调用该本地代码来重新计算IDs。

1.1K20

JNI--局部引用全局引用,弱全局引用

JNI中有三种引用 1.局部引用--定义方式多样:FindClass,NewObject,GetObjectClass,NewCharArray.......JNI中同一时间最多使用512个局部引用,所以我们有必要去手动释放 //局部引用 JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5...创建全局引用的唯一方法 创建全局引用 //创建全局引用 jstring global_str; JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5...jobject jobj) { return global_str; } 删除全局引用 //删除全局引用 JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5...image.png 3.弱全局引用--它不会阻止GC,可跨线程,跨方法使用 //创建弱全局引用 jstring global_weak_str; JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5

1.5K20

【Android NDK 开发】JNI 引用 ( 全局引用 | NewGlobalRef | DeleteGlobalRef )

全局引用 II . 创建全局引用 ( NewGlobalRef ) III . 全局引用代码示例 I . 全局引用 ---- 1 ....全局引用作用域 : 与局部引用对比 : 全局引用与局部引用相对应 , 其作用域全局的 , 局部引用只能在当前方法使用 ; 空间 : 可以 跨方法 , 跨线程使用 ; 时间 : 创建后可以使用 , 手动释放后全局引用失效...函数原型 : 传入一个局部引用参数 , 将局部引用转为全局引用 ; 返回值 : 由局部引用转换成的全局引用 ; 参数 : jobject obj : 使用 NewXXX / FindXXX 等 大多数...JNI 方法 默认创建的 Java 引用类型对象 都是局部引用 ; struct _JNIEnv { /* _JNIEnv 结构体中封装了 JNINativeInterface 结构体指针 *...jclass tmp_class = env->FindClass("kim/hsl/jni/Teacher"); //将上述生成的局部引用变成 全局引用 //

72820

【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )

全局引用 ---- 若全局引用 特点 : 弱全局引用 最大的特点 可以被 JVM 自动回收 ; 弱全局引用 作用域 : ① 空间 : 都可以 跨方法 , 跨线程使用 ② 时间 : 创建弱全局引用后可以开始使用..., JVM 自动回收 手动释放 该弱全局引用不可用 ; 弱全局引用全局引用 区别 : ① 全局引用 : 不能被 回收 , 如果内存不足就 抛出异常 ② 弱全局引用 : 当内存不足时 ,...jweak obj) { functions->DeleteWeakGlobalRef(this, obj); } ... } ① NewWeakGlobalRef : 传入局部变量作为参数...: 空间 : 都可以 跨方法 , 跨线程使用 时间 : 创建弱全局引用后可以开始使用 , JVM 自动回收 手动释放 该弱全局引用不可用..., 该局部引用使用完毕后可释放 jclass tmp_class = env->FindClass("kim/hsl/jni/Teacher"); //将上述生成的局部引用变成弱全局引用

29530

Java 参数传递值传递还是引用传递?

首先把结论表明,Java 的参数传递值传递,因为有部分细节让人引起误解以为引用传递,故我们写两个例子来举例探讨。...name小黑 地址为 demo.rzj.com.androiddemo.ExampleUnitTest$Student@1a93a7ca age 1000 name灭霸 相信大部分同学对于Java 值传递最大的疑问就是为什么这个例子中的...Student 实例对象 a 传递到 change 方法中 age 、name 参数被改变了会影响到外面的对象,大家先看一下控制台的输出,当我们对形参 b = c 时,它的内存地址确实是改变了,但是并没有影响到外面的...a 对象的内存地址,这就充分说明了值传递,只不过值得一提的,这个值传递复制了一份对象,但是里面的参数引用的地址指向一样的,重点理解的引用数据类型传递的确实是值,但是对象内部的参数指向的一样的数据

2.8K20

Java的参数传递值传递还是引用传递

当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底值传递还是引用传递?    答:按值传递。Java 语言的参数传递只有按值传递。...当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 永远不会改变的。...Java的参数传递,不管基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!  ...我们可以看一下microsoft的文档中对按引用传递参数的定义(如下截图): 1、基本数据类型的参数 先来看一下基本数据类型的参数按值传递的例子: TransferTest.java public class...按值传递的精髓:传递的存储单元中的内容,而不是存储单元的引用

3.2K40

Go语言参数传递传值还是传引用

对于了解一门语言来说,会关心我们在函数调用的时候,参数到底传的值,还是引用? 其实对于传值和传引用一个比较古老的话题,做研发的都有这个概念,但是可能不是非常清楚。...比如我们传递一个int类型的参数,传递的其实是这个参数的一个副本;传递一个指针类型的参数,其实传递的这个该指针的一份拷贝,而不是这个指针指向的值。...什么引用(引用传递) Go语言(Golang)没有引用传递的,这里我不能使用Go举例子,但是可以通过说明描述。...这也就是说,map类型和我们自己定义的struct类型不一样的。我们尝试把modify函数的接收参数改为Person的指针。...是否可以修改原内容数据,和传值、传引用没有必然的关系。在C++中,传引用肯定是可以修改原内容数据的,在Go语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数引用类型。

2.2K30

Android 进阶解密笔记-JNI 基础

摘抄自>一书 JNI 是什么 JNIJava Native Interface的缩写, 译为本地接口,Java与其他语言通信的桥梁。..."[",有些数据类型签名会以";"结尾** JNI方法签名 JNI方法签名格式为:(参数签名格式...)返回值签名格式** 方法签名: 为什么要方法签名,是为了解决 方法重载问题,当两个方法相同时,但参数不同...Java中的变量和对象等) 局部引用全局引用与弱引用比较 和Java引用类型一样,JNI也有引用类型,分别是,本地引用全局引用与弱引用 局部引用 局部引用:通过NewLocalRef和各种JNI接口创建...会阻止GC回收所引用的对象,不在本地函数中跨函数使用,不能跨线前使用。函数返回后局部引用引用的对象会被JVM自动释放,调用DeleteLocalRef释放。...GC回收 弱全局引用全局引用:调用NewWeakGlobalRef基于局部引用全局引用创建,不会阻止GC回收所引用的对象,可以跨方法、跨线程使用。

51130

图解Java 中的参数传递传值还是传引用

Java 中的参数传递传值呢?还是传引用?...java中只有值传递,没有引用传递 形参:方法列表中的参数 实参:调用方法时实际传入到方法列表的参数(实参在传递之前必须初始化) 值传递:传递的实参的副本(更准确的说是实参引用的副本,因为形参接受的对象的引用...) 引用传递:传递的内存地址 public static void main(String[] args) { // 实参 int num = 1; // num 没有被改变...StringBuilder("iphone")对象 * 将main栈中的sb2的副本传递给foo2中的形参builder,builder指向堆中的StringBuilder("iphone")对象(与main同一个对象...) * foo2栈中的builder指向StringBuilder("ipad")对象 * main栈中的sb2不会受影响 * 如果引用传递main中的sb2会收到影响

6810

Java的参数传递「按值传递」还是「按引用传递」?

下面我们就来说说 Java中的参数传递到底按值传递还是按引用传递? 首先说下正确的答案:Java 的参数传递,不管基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!...首先,我们应该了解按值传递引用传递的含义。 按值传递:将方法参数值复制到另一个变量,然后传递复制的对象,将其称为按值传递。...按引用传递:将对实际参数的别名引用传递给方法,将其称为按引用传递的原因。 你个糟老头子坏得狠,我信你个鬼,你这个解释给我要给差评..... 且听老夫(哦,不,小编)慢慢道来......当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 永远不会改变的。...我希望上面的解释能消除所有疑问,只需要记住Java 的参数传递,不管基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!。

2.3K30

Android JNI学习(四)——JNI的常用方法的中文API

JNI_FALSE 五、全局引用和局部引用 (一)、创建全局引用 jobject NewGlobalRef(JNIEnv *env,object obj); 给对象obj创建一个全局引用,obj可以是全局局部引用...*env,jobject globalRef); 删除全局引用 参数解释: env:JNI接口指针 globalRef:需要被删除的全局引用 (三)、删除局部引用 局部引用只在本地接口调用时的生命周期内有效...(八)、弱全局引用全局引用是一种特殊的全局引用,不像一般的全局引用,一个弱全局引用允许底层Java对象能够被垃圾回收。弱全局引用能够应用在任何全局局部引用被使用的地方。...参数解释 env:JNI接口指针 obj:局部、全局全局引用 返回: JNIInvalidRefType=0:代表obj参数不是有效的引用类型 JNILocalRefType=1:代表obj参数局部变量类型...JNIGlobalRefType=2:代表obj参数全局变量类型 JNIWeakGlobalRefType=3:代表obj参数全局有效引用 无效的引用就是没有引用引用

2.9K20

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

PS: 开发JNI程序会受到系统环境限制,因为用C/C++ 语言写出来的代码模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。...i和s:用于传递的参数 关于obj、i和s的类型大家可以参考下面的JNI数据类型,JNI有自己的原始数据类型和数据引用类型如下: ?...JVM与JavaVM.png 其中JavaVMJava虚拟机在JNI层的代表,JNI全局仅仅有一个JavaVM结构中封装了一些函数指针(叫函数表结构),JavaVM中封装的这些函数指针主要是对JVM...,与全局引用类似,创建跟删除都需要由编程人员来进行,这种引用全局引用一样可以在多个本地带阿妈有效,不一样的,弱引用将不会阻止垃圾回收期回收这个引用所指向的对象,所以在使用时需要多加小心,它所引用的对象可能不存在的或者已经被回收...但是需要注意的,IsSameObject用于弱全局引用与NULL比较时,返回值的意义不同于局部引用全局引用的。

2K32

JNI线程相关

一种比较常见的应用场景:在native 层创建了线程,线程执行完后想将结果返回给java层,这时线程不能用jni函数参数中的JNIEnv的,因为参数中的JNIEnv属于不同的线程....if (status < 0) { javaVM->DetachCurrentThread(); } 局部引用,全局引用和弱全局引用 局部引用 传递给原生方法的每个参数,以及...会阻止GC回收所引用的对象,不能在本地函数中跨函数使用,不能跨线前使用。 函数返回后局部引用引用的对象会被JVM自动释放....JVM不会自动释放,必须调用DeleteGlobalRef手动释放 弱全局引用 调用NewWeakGlobalRef基于局部引用全局引用创建,不会阻止GC回收所引用的对象,可以跨方法、跨线程使用。....u全局引用必须要主动地去释放它,可以猜测到释放的地方在JNIMediaPlayerListener的析构函数 JNIMediaPlayerListener::~JNIMediaPlayerListener

1.3K20

java中,方法参数基本类型和引用类型的区别

方法参数基本类型时,传递的值。 ...方法参数引用类型时,传递的内存地址值 当参数基本类型时,在调用方法时将值传递到方法中,运行方法,运行结束方法退出,对原本main中定义的变量没有任何操作(方法中没有return)。...当参数引用类型时,比如:定义数组时,在堆内存中存储了数组的数据,返回这组数据的地址给了数组名,然后在调用方法时,传递的也是这个地址。...也就是说 ,当形式参数基本类型时,方法传的只是值,实际上main 里的实际参数和外部方法里的形式参数不同的两个东西,如果方法不返回值,change里不管怎么改变,与main无关。...而当形式参数引用类型时,比如:形式参数数组时,两个方法通过同一个地址,使用的同一个堆内存里的数组,同一个东西,所以外部方法里面改变了这个数组之后,main再调用也是改变之后的数组。

1.4K20

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

从 Java 调用 Native 从 Native 调用 Java 的成本很高,使用 JNI 时要限制跨越 JNI 边界的调用次数; 问题 2 - 引用类型数据的回收: 由于引用类型数据(例如字符串...5.2 JNI 中的三种引用 1、局部引用: 大部分 JNI 函数会创建局部引用,局部引用只有在创建引用本地方法返回前有效,也只在创建局部引用的线程中有效。...3、弱全局引用: 弱引用全局引用类似,区别在于弱全局引用不会持有强引用,因此不会阻止垃圾回收器回收引用指向的对象。...由于 JavaVM 进程共享的,因此全局引用可以跨方法和跨线程共享; JavaEnv 内有 locals 表管理局部引用,由于 JavaEnv 线程独占的,因此局部引用不能跨线程。...另外虚拟机在进入和退出本地方法通过 Cookie 信息记录哪些局部引用是在哪些本地方法中创建的,因此局部引用是不能跨方法的。

1.8K20

你应该了解的JNI知识(三)——注意点

第一个参数优先级,和Log的等级对应的,第二个参数tag,第三个参数log内容。 关于更多内容和方法可以参考log.h的注释。...全局引用和局部引用 试想一种场景,在JNI_OnLoad中通过FindClass找到某一个类,然后用作静态变量,在以后某个场景使用该静态场景,一些是不是设想的很美好,但在JNI环境中不行的。...hl=zh_cn#kotlin 三种引用JNI规范中定义了三种引用:局部引用全局引用、弱全局引用。 局部引用:通过NewLocalRef和各种JNI接口创建。...会阻止GC回收所引用的对象,不在本地函数中跨函数使用,不能跨线程使用。函数返回后局部引用引用的对象会被JVM自动释放,调用DeleteLocalRef释放。...弱全局引用:调用NewWeakGlobalRef基于局部引用全局引用创建,不会阻止GC回收所引用的对象,可以跨方法、跨线程使用。

1.2K70

你真的会用JNI吗?这些小技巧99%的人都不知道

目的帮助您识别并避开它们,以便您可以编写稳定、安全、高效的JNI代码。   JNI编程陷阱分为两类: 性能:代码执行设计的功能,但速度很慢导致整个程序速度变慢。...性能陷阱   使用JNI的程序员面临的五大性能缺陷: 不缓存方法ID,字段ID和类 触发数组拷贝 返回而不是传递参数本地代码和Java代码之间选择了错误的边界 使用许多本地引用而不通知JVM 不缓存方法...JNI代码使用错误   JNI的五大使用错误: 错用 JNIEnv 不检查异常 不检查返回值 错误地使用数组方法 错误地使用全局引用 错用JNIEnv   子线程执行本地代码,尝试通过JNIEnv调用JNI...这些限制包括在Get和Release调用之间执行的所有代码,无论它是否本地代码的一部分。 错误地使用全局引用   本地代码可以创建全局引用,以便在不再需要对象之前不会对其进行垃圾回收。...常见的问题忘记删除已创建的全局引用完全丢失它们的引用

96820

深入 Android 系统 - Android 的 JNI

Java类中的native方法的名称 signature指native方法的参数签名 fnPtr指native方法对应的本地函数指针 虽然这里fnPtr一个void类型的函数指针 但是,JNI中对于函数的定义也是有要求的...中的引用JNI中有三种引用本地引用(LocalReference)、全局引用(GlobalReference)、弱全局引用(WeakGlobalReference)。...本地引用(LocalReference) 在JNI本地函数中生成的Java对象,它们的生命周期应该在函数退出时结束。 虚拟机如何保证呢?...(LocalReference)表中删除 然后将该对象放到全局引用(GlobalReference)表中 DeleteGlobalRef做了: 将Java对象从全局引用(GlobalReference)...表中删除 此时不会立刻回收对象,等到下次垃圾回收时才会释放 弱全局引用(WeakGlobalReference) 弱全局引用 (WeakGlobalReference) 引用下的对象如果没有其他的引用类型时

1.7K40
领券