问题标签 [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.

0 投票
1 回答
1395 浏览

java - JNI GetFieldID 为内部类返回 null

我有想要在 JNI 中访问的公共内部类。GetFieldID 在访问内部类的 fieldId 时返回 null

下面是代码

注意:当我在类文件上运行 javap -s 时,我得到以下输出

这是调用本机函数的类。

本机代码

我也尝试了以下选项但失败了

有人可以建议如何获取 classB 的字段 id 并访问 b1。

0 投票
1 回答
799 浏览

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

0 投票
2 回答
3720 浏览

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)当我调用getWeakGlobalRefgetLocalRef并清除ArrayList时,GC 似乎收集了我创建的所有Dummy对象。2)当我调用getGlobalRef时,无论我是否清除ArrayList ,都不会收集任何对象。l

我在这里有点困惑,这是否意味着我可以将本地方法的本地引用返回给 Java 代码?

0 投票
1 回答
104 浏览

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) 没有执行(我没有对缓冲区进行数据修改)并且在尝试执行GetEnvAttachCurrentThread时使应用程序崩溃。

对于无法获取其 JNIenv 的 C 代码调用 JAVA 代码的最佳方式是什么?

0 投票
1 回答
110 浏览

android-ndk - jString定义编译错误

我正在与 JNI 合作。我试图在项目 main.cpp 文件中定义一个 jstring。我尝试使用以下一个,但是当我尝试使用 NDK 编译时。我会显示错误。

如果您对 NSString 或 String 有任何其他方式,请告诉我。

0 投票
2 回答
1433 浏览

android - android jni - NewObject 函数不调用构造函数?

我已经构建了一个简单的示例来从本机代码调用 java 方法,并且我正在调用某个对象的 java 方法,但构造函数从不调用。

我的java类:

cpp代码:

主要活动 :

}

日志输出是:

我怎么会在对象上调用方法但构造函数从不调用?

0 投票
1 回答
4249 浏览

java - JNI线程模型?

当我从 Java 调用 C/C++ 时,JavaVM 或 JNI 是否创建了一个新线程来在我的 Java 线程等待时运行 C/C++ 代码?我问这个是因为我的 C/C++ 代码在 GPU 上运行一些东西,我需要检查一个特定的缓冲区来获取结果。得到结果后,我需要再次调用我的 Java 函数。

所以我想在 C++ 端创建一个线程,不断检查缓冲区,一旦有一些数据可用,就回调 Java 端。

0 投票
1 回答
730 浏览

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 参数,或对象之前的原始参数等。

如果是,是否有任何参考/文档建议它,如果没有,那么为什么我的代码在更改参数顺序后工作?

0 投票
1 回答
1201 浏览

android - android JNI报告找不到方法

我正在使用以下代码来包装所有本机函数

我使用 C++ 中的以下内容

我从我的主要活动中调用包装类

但是当我打电话时,call_Java_checkStoragePermission()我收到以下错误

有人能帮我吗?

0 投票
1 回答
477 浏览

android - 来自 WeakGlobalRef 的 JNI LocalRef

我遇到了 WeakGlobalRef 指向垃圾收集对象的问题,当我尝试在这个 ref 上调用 CallVoidMethod 时,这个应用程序崩溃了。为了解决这个问题,我执行以下操作:

这仍然在 CallVoidMethod 崩溃,这样做是否有效,或者我也应该检查本地参考IsSameObject

我转储的最后一件事,没有什么可以指出任何方法: