问题标签 [jnienv]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - JNI GetFieldID 为内部类返回 null
我有想要在 JNI 中访问的公共内部类。GetFieldID 在访问内部类的 fieldId 时返回 null
下面是代码
注意:当我在类文件上运行 javap -s 时,我得到以下输出
这是调用本机函数的类。
本机代码
我也尝试了以下选项但失败了
有人可以建议如何获取 classB 的字段 id 并访问 b1。
java - JNI 加载具有依赖项的 jar
我正在尝试使用 JNI 在我的 C++ 程序中加载以下 java 类:
它取决于 log4j-1.2.16.jar
这是我的 C++ 代码:
我已将 HelloWorld.jar 放在 C++ 应用程序的根文件夹中。当它尝试加载 hello_world_class 时,会抛出以下异常:
JNI 找不到 log4j 依赖项,因为它不在 HelloWorld.jar 中。我试图将它放在 lib 文件夹和 HelloWorld.jar 的同一个文件夹中,但它不起作用。我需要将 log4j.jar 放在哪里,以便 JNI 可以重新配置它并加载它?
非常感谢您,我是 jni 的新手,所以请在您的回答中明确。我整天都在这个错误TT
java - 从本地方法返回由 JNI 创建的本地引用
JNI 参考说
“本地引用在本地方法调用期间有效。本地方法返回后它们会自动释放。
资料来源:http ://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#global_local
我有点迷失在这里。根据上述,我必须显式调用NewGlobalRef并将调用返回的对象传递给NewObject。我试过了,似乎当 GC 启动时,它不会收集我的引用(就像某些东西仍然保留在它们上一样)。考虑以下项目: Main.java:
虚拟.java:
libdummy.so 包含本机方法的实现:
主循环表现出的行为对我来说似乎很奇怪:1)当我调用getWeakGlobalRef或getLocalRef并清除ArrayList时,GC 似乎收集了我创建的所有Dummy对象。2)当我调用getGlobalRef时,无论我是否清除ArrayList ,都不会收集任何对象。l
我在这里有点困惑,这是否意味着我可以将本地方法的本地引用返回给 Java 代码?
java - C 代码需要调用 Java 代码缓冲区但无法获取其 JNIEnv
我有一个 java 缓冲区,我需要一些 c 数据操作。为此,我调用了本机函数“SimpleFunction”,该函数调用 java 代码以检索特定索引处的缓冲区值 (buffer_read_byte) 并保存修改后的值 (buffer_byte_write)。
Java端:
C面:
上面的代码有效。
现在让我们假设数据操作是由许多在内核中使用 c 函数 buffer_read_byte 和 buffer_byte_write 的内部函数获得的。如何避免在每个调用函数级别显式传递作为输入(JNIEnv * env, jobject this)?
我有很多预先存在的函数,最后需要使用 buffer_read_byte 和 buffer_byte_write 访问 java 缓冲区。由于仅在内核函数 buffer_read_byte 和 buffer_byte_write 中需要 JNIEnv ,如何避免在每个预先存在的父函数和子函数中必须声明输入(JNIEnv * env, jobject this) ?
我检查了全局 JVM:
但是调用 SimpleFunction(100) 没有执行(我没有对缓冲区进行数据修改)并且在尝试执行GetEnv或AttachCurrentThread时使应用程序崩溃。
对于无法获取其 JNIenv 的 C 代码调用 JAVA 代码的最佳方式是什么?
android-ndk - jString定义编译错误
我正在与 JNI 合作。我试图在项目 main.cpp 文件中定义一个 jstring。我尝试使用以下一个,但是当我尝试使用 NDK 编译时。我会显示错误。
如果您对 NSString 或 String 有任何其他方式,请告诉我。
android - android jni - NewObject 函数不调用构造函数?
我已经构建了一个简单的示例来从本机代码调用 java 方法,并且我正在调用某个对象的 java 方法,但构造函数从不调用。
我的java类:
cpp代码:
主要活动 :
}
日志输出是:
我怎么会在对象上调用方法但构造函数从不调用?
java - JNI线程模型?
当我从 Java 调用 C/C++ 时,JavaVM 或 JNI 是否创建了一个新线程来在我的 Java 线程等待时运行 C/C++ 代码?我问这个是因为我的 C/C++ 代码在 GPU 上运行一些东西,我需要检查一个特定的缓冲区来获取结果。得到结果后,我需要再次调用我的 Java 函数。
所以我想在 C++ 端创建一个线程,不断检查缓冲区,一旦有一些数据可用,就回调 Java 端。
java - JNI 是否需要根据参数类型对参数进行排序
我正在尝试在我的应用程序中集成一些 JNI 代码,这些代码从 Web 服务接收数据并从那里在 JNI 层中解析它我尝试通过传递从 Web 服务接收到的一些参数来调用 Java 层中定义的方法。以下是函数和方法的流程:
为 jclass 和 jmethodID 定义的变量:
在 c 层定义的结构来保存值
这个功能有问题。该函数在从 webservice 接收数据、解析并创建 struct User_Info 后调用
Java方法:
问题是当我运行代码时,我收到以下错误:
JNI 错误(应用程序错误):预期 jboolean (0/1) 但将值 1048605 作为 com.model.UserInfo com.model.UserInfo.createUserInfo(int, java.lang.String, java.lang.String,布尔值)
当我更改 java 方法和 jni 函数中的参数顺序并在 int 'userId' 之后保持布尔值 'follow' 时,不会发生问题。
我的问题是:
JNI 是否需要根据参数类型对参数进行排序,例如长/布尔之前的 int 参数,或对象之前的原始参数等。
如果是,是否有任何参考/文档建议它,如果没有,那么为什么我的代码在更改参数顺序后工作?
android - android JNI报告找不到方法
我正在使用以下代码来包装所有本机函数
我使用 C++ 中的以下内容
我从我的主要活动中调用包装类
但是当我打电话时,call_Java_checkStoragePermission()
我收到以下错误
有人能帮我吗?
android - 来自 WeakGlobalRef 的 JNI LocalRef
我遇到了 WeakGlobalRef 指向垃圾收集对象的问题,当我尝试在这个 ref 上调用 CallVoidMethod 时,这个应用程序崩溃了。为了解决这个问题,我执行以下操作:
这仍然在 CallVoidMethod 崩溃,这样做是否有效,或者我也应该检查本地参考IsSameObject
我转储的最后一件事,没有什么可以指出任何方法: