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

Android JNI 线程操作

学习一下如何在 Native 代码中使用线程。 Native 中支持的线程标准是 POSIX 线程,它定义了一套创建和操作线程的 API 。...将线程附着在 Java 虚拟机上 在上面的线程启动函数,只是简单的执行了打印 log 的操作,如果想要执行和 Java 相关的操作,比如从 JNI 调用 Java 的函数等等,那就需要用到 Java...pthread_create 创建的线程是一个 C++ 线程,虚拟机并不能识别它们,为了和 Java 空间交互,需要先把 POSIX 线程附着到 Java 虚拟机上,然后就可以获得当前线程的 JNIEnv...通过 AttachCurrentThread 方法可以将当前线程附着到 Java 虚拟机上,并且可以获得 JNIEnv 指针。...的方法,打印当前线程 id ,发现不是主线程就对了 env->CallVoidMethod(gObj, printThreadName); // 从 Java 虚拟机上分离当前线程

1.1K20

【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

JNI 线程创建 II . 线程执行函数 III . 线程方法获取 Java 对象 IV . 线程方法获取 JNIEnv V . JNI 线程 完整代码示例 I . JNI 线程创建 ---- 1....线程方法获取 Java 对象 ---- 线程方法获取 Java 对象步骤 : ① 定义全局变量 jobject obj : 使用该全局变量存储 Java 对象 ; //JNI 方法参数的第二个参数 ,...线程方法获取 JNIEnv ---- 线程获取 JNIEnv * env 步骤 : ① JNIEnv 无法跨线程 : JNI 方法参数的 JNIEnv 指针是不能跨线程使用的 , 在 主线程调用...线程 Demo */ public native void threadDemoJava(); /** * 打印当前线程信息 */ public...> //Java 虚拟机指针 , 在 JNI_OnLoad 方法设置该值 JavaVM *_vm; //JNI 方法参数的第二个参数 , 需要先将局部变量转为全局变量 , 然后再其它方法调用

72820
您找到你想要的搜索结果了吗?
是的
没有找到

Android 通过 JNI 访问 Java 字段和方法调用

在前面的两篇文章,介绍了 Android 通过 JNI 进行基础类型、字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系。...其中,第一个参数就是之前获得的 Java 类型,第二个参数就是在 Java 字段的具体名字,第三个参数就是字段对应的具体类型,这个类型的签名描述要转换成 Native 的表示形式,也就是之前提到的 Java...对于类的静态字段,JNI 的方法多了 Static 的标志来表明这个对应于类的静态字段访问。...方法调用 JNI 调用 Java 方法和 JNI 访问 Java 字段的步骤也大致相同, 获取 Java 对象的类 获取对应方法的 id 调用具体的方法 以调用类的实例方法和静态方法为例: 调用类的实例方法...小结 可以看到,从 JNI 访问 Java 的字段和访问,两者的步骤都是大致相似的,只是调用的 JNI 方法有所区别。 具体示例代码可参考我的 Github 项目,欢迎 Star。

1K10

Java 17 更新(10):访问外部函数的新 API,JNI 要凉了?

关键词:Java Java17 JNI 不安全还繁琐,所以 Java 搞了一套新的 API,结果把这事儿搞得更复杂了。。。...Java 17 更新(7):模式匹配要支持 switch 啦 Java 17 更新(8):密封类终于转正 Java 17 更新(9):Unsafe 不 safe,我们来一套 safe 的 API 访问堆外内存...相比之前,JNI 需要提前通过声明 native 方法来实现与外部函数的绑定,新 API 则提供了直接在 Java 层通过函数符号来定位外部函数的能力: System.loadLibrary("libsimple...函数指针入参 很多时候我们需要在 C 代码当中调用 Java 方法,JNI 的做法就是反射,但这样会有些安全问题。...新提供的这套访问外部函数的 API,相比之下它确实比过去有了更丰富的能力,不过用起来也并不轻松。

2.1K30

初学JNI java调用c++的函数 helloworld实验

reference https://www.cnblogs.com/liuling/p/2013-12-20.html 简介 利用JNI可以让java的代码调用c/c++的代码。...很多时候,某些功能用Java无法实现,这时候我们就可以利用JNI来调用C或者C++程序来实现。 比如说涉及到底层驱动的一些功能,这就是JNI的强大之处。...但是JNI也有它的缺点,使用java与本地已编译的代码交互,通常会丧失平台可移植性。 以下这个例子,是java调用c++输出hello world的例子。也是我根据博客做的实验的记录。...<< endl; } 这里因为nativeTest_NativeTest.h引入了jni.h,所以要将jni.h加入到vs安装目录下的VC/Include目录。...jni.h在JDK安装目录下的include。 同时得将include/win32的两个头文件jawt_md.h、jni_md.h也导入到vs,放在同上的路径。

95280

「音视频直播技术」JNI注意事项(一)

今天我们就为大家讲讲使用JNI都需要注意些什么。 JNI JNI(Java Native Interface), 用于 Java 代码与 C/C++ 代码之间的相互调用。...绑定本地创建的线程时会构造 java.lang.Thread对象,并把它添加到 "main"线程组(ThreadGroup),使得 debugger 可以知道它。...jclass, jmethodID 和 jfieldID 查你想通过Native代码访问java对象里的域,你可按如下步骤做: 使用 FindClass 得到类对象的引用。...Local 和 Global 引用 传给Native方法的每个参数和几乎由JNI函数返回的每个对象都是一个本地引用。这意味着它在当前线程当前Native方法里是有效的。...通常,任何在Native代码创建的本地引用也需要手动删除。

1.8K20

jnaerator:JNA框架下向动态库传递Java Object(即动态库JNI方式访问java对象)

但有的时候,我们希望java层与动态库直接传递Java对象,动态库以JNI方式访问java层传递的Java对象,或直接返回java对象给java层,JNA可以实现么?...OPTION_ALLOW_OBJECTS JNA在调用一个native函数时是可以指定一些特别选项的。...这些特别要求中就有一个我们本次任务要用到的选项: com.sun.jna.Library.OPTION_ALLOW_OBJECTS 该选项是个布尔值,为true时允许任何Java对象作为输入参数或返回值...下面是我在动态库定义的一个函数 // @param env JNIEnv 结构,JNI方式访问Java对象必须要有它 // @param arg 输入Java 对象 // @param...MegauthLibrary.JNA_NATIVE_LIB.getFunction("meg_obj_arg"); // 调用invoke方法,注意这里要用 com.sun.jna.JNIEnv.CURRENT 对象代替实际的动态库访问

1.1K20

NDK 开发的几个重要知识点

在 Native 层访问 Java 对象的一般步骤 在 Native 层通过 JNI 可以自由地访问 Java 对象,访问 Java 对象一般分为 3 步。 I....访问 Java 对象时,需要注意值传递和引用传递的区分, jint、jchar、jdouble 等基本类型是值传递,而 jstring、jobject 等属于引用传递。...在 Native 层 Java 对象的引用类型 在 JVM Java 对象的引用类型分为 “强、软、弱、虚” ,我们常用的一般是弱引用,而在 Native 层 Java 对象的引用类型一般分为...JNIEnv 和 JavaVM 类型的作用域 JNIEnv 这个结构体比较特殊,主要提供 JNI 调用环境(JNI Environment),JNIEnv 类型的变量是线程相关,即一个线程会对应一个 JNIEnv...若要在一个子线程访问 Java 对象,就需要获得对应 JNIEnv 类型变量的指针,一般通过一对 JNI 方法进行获取和释放: //获取 jvm->AttachCurrentThread(&env);

96320

JNI开发,你需要知道的一些建议

线程 所有的线程都是Linux线程,由内核统一调度。它们通常从Java启动(使用new Thread().start()),也可以在其他任何地方创建,然后连接(attach)到JavaVM。...局部和全局引用 每个传入Native方法的参数,以及大部分JNI函数返回的每个对象都是“局部引用”。这意味着它只在当前线程当前方法执行期间有效。...通常,任何在循环中创建局部引用的Native代码可能都需要做一些手动删除。 UTF-8、UTF-16 字符串 Java编程语言使用UTF-16格式。...JNI Throw和ThrowNew指令仅仅是在当前线程中放入一个异常指针。从Native代码返回到Java代码时,异常将会被注意到,得到适当的处理。...允许从Java代码快速地访问。然而,在Native代码端不能保证不去拷贝一份就直接能够访问数据。

1.3K30

【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )

前置知识点 : 参考 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) 博客内容 , 了解如何在 C++ 调用..., 注意子线程JNI 环境需要获取 , 主线程JNI 环境可以直接从 Native 层实现的 Java 方法获取 ; ② jobject instance : 在 Native 层的 Java...JavaVM *vm ---- JavaVM *vm 获取方法 : 在 JNI_OnLoad() 方法获取 ; //JNI_OnLoad 获取的 Java 虚拟机对象放在这里 JavaVM *javaVM...//子线程 : 需要通过 JavaVM * 获取该子线程的 JNIEnv * JNIEnv *env_thread; //Java 虚拟机 调用附加线程的方法 , 可以获取当前线程的...获取该子线程的 JNIEnv * JNIEnv *env_thread; //Java 虚拟机 调用附加线程的方法 , 可以获取当前线程的 JNIEnv* 指针

97720

java(JVM)结束时释放JNI资源(Runtime.addShutdownHook)

如下代码cmjnidrv是一个动态库,CodeCacheManager在类加载时就自动将cmjnidrv加载进来。cmjnidrv中有多个独立的线程在运行并申请了大量的内存....release()是个native方法,用于释放cmjnidrv的申请资源并中止cmjnidrv线程。...也没有log “release JNI resoure…”输出,显示finalize()方法没有被执行。 所以如何在JVM结束时释放静态加载的动态库的资源还是得另想办法。...当JVM结束时(正常结束,或被Ctrl-C中止,或因系统事件(logoff ,shutdown))会执行用addShutdownHook方法注册的线程。...所以确保静态加载的JNI资源释放的办法,就是在加载动态库的时候,向JVM注册一个hook线程,用于执行release()方法。

89120

java JNI简介

JNI的接口函数和指针 native代码想要访问 java虚拟机需要调用JNI方法,而获取JNI方法则通过 JNI interface Pointer。...interface Pointer 只在当前线程有效,即native 方法不能在线程之间传递(不同线程的指针可能不一 样),VM保证同一个线程调用多次JNI interface Pointer是同一个...编译 JAVA VM支持多线程,native 方法在编译的时候需要加上对应的参数, gcc加上 -D_REENTRANT或者-D_POSIX_C_SOURCE 加载 代码如下 package pkg...如果要静态连接可以使用 JNI的函数 RegisterNatives 静态连接需要把所有的library复制到可执行的映像;动态连接是把共享的library的名字放在一个可执行的映像,当映像运行的时候才去连接...* -o:指定动态链接库编译后生成的路径以及文件名 * -framwork JavaVM -I:编译JNI需要用到的JVM头文件(jni.h) 复制代码 执行java程序,指定动态链接库 命令为 java

51120

【Rust笔记】Rust与Java交互-JNI模块编写-实践总结

下面用一段代码展示如何在Rust创建Java对象、调用方法、获取字段、处理异常等常见用法 #[allow(non_snake_case)] fn call_java(env: &JNIEnv) {...支持方法重载,同一个类里一个名称的函数可能有多个,所以需要通过类型签名来区分,类型签名的规则可以参考官方文档 异常处理 call_java函数展示了如何在Rust处理Java的异常: 通过JNIEnv...,如果再返回到Java便可以继续执行 在非Java线程调用JavaJava调用的Rust代码,本身就处于一个Java线程,第一个参数为JNIEnv对象,Rust代码用这个对象和Java进行交互...; 实际应用场景,可能需要从一个非Java线程或者说我们自己的线程中去调用Java的方法,但我们的线程没有JNIEnv对象,这时就需要调用JavaVM::attach_current_thread函数将当前线程附加到...函数;原始的AttachCurrentThreadJNI函数,如果当前线程已经attach了,则会抛异常,jni crate里的JavaVM::attach_current_thread做了一层封装,如果当前已经

74230

Android基础--JNI

3 JNIEnv 顾名思义,指代了Java本地接口环境(Java Native Interface Environment),是一个JNI接口指针,指向了本地方法的一个函数表,该函数表的每一个成员指向了一个...JNI函数,本地方法通过JNI函数来访问JVM的数据结构 3.1 JNIEnv 作用 调用 Java 函数 : JNIEnv 代表 Java 运行环境, 可以使用 JNIEnv 调用 Java 的代码...; 操作 Java 对象 : Java 对象传入 JNI 层就是 Jobject 对象, 需要使用 JNIEnv 来操作这个 Java 对象 3.2 JNIEnv 与线程 JNIEnv指针只在它所在的线程中有效...不同线程调用一个本地方法时,传入的JNIEnv指针是不同的. 比如,在jni的方法起了线程去处理事件,处理完后希望能通知java层,线程是不能使用参数JNIEnv的。...,然后返回属于当前线程的JNIEnv指针。

1.1K10

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

JNI 访问 Java 字段与方法 这一节我们来讨论如何从 Native 层访问 Java 的字段与方法。在开始访问前,JNI 首先要找到想访问的字段和方法,这就依靠字段描述符和方法描述符。...因此,从 JNI 访问 Java 层的字段或方法时,首先就是要获取在 Class 文件记录的简单名称和描述符。...因此,在 JNI 层出现异常时,有 2 种处理选择: 方法 1: 直接 return 当前方法,让 Java 层去处理这个异常(这类似于在 Java 向方法外层抛出异常); 方法 2: 通过 JNI...JNI 与多线程 这一节我们来讨论 JNI的多线程操作。...也会存在多个线程同时访问一个内存资源的情况,此时需要保证并发安全。

1.9K20
领券