问题标签 [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 回答
276 浏览

android - Android NDK,并将函数放在活动类之外

文章中提到: http ://androidcookbook.com/Recipe.seam?recipeId=77

是:

"在 Activity 类中,在任何方法之外:

"

如果设计师想要将所有 NDK 操作(加载库、定义函数)放在活动之外,她/他可以吗?
我试图通过创建一个新类并将其导入活动来解决这个问题。我将加载库放在类构造函数中,并将方法定义放在另一个类中。该活动似乎加载了库,但会崩溃,并出现找不到函数的错误

编辑以添加详细信息:我再次尝试了此操作,但将 loadLibrary 函数放回了 Activity 中。我得到相同的崩溃报告: java.lang.UnsatisfiedLinkError: Native method not found:

0 投票
2 回答
407 浏览

android-ndk - 如何使用 ndk 中的 make trace 选项

****这个问题是关于从 ndk-build 调用 make trace 选项*********

我正在尝试通过 make 文件进行跟踪,但出现错误。我的理解是ndk是shell,它调用make。所以我应该能够调用 make 开关;我可以做其中的一些。但是跟踪选项不起作用:-(请参阅下面的输出;我做错了什么?

@MadScientist - 我下载并安装了 4.0 版。但我仍然看到同样的错误。任何人都可以在他们的系统上运行它,并发布他们使用的命令吗?我想我可能会触发开关故障或其他什么。如果我能看到一个工作实例,我可以从那里微调命令。还; 我查看了您发布的 make-4.0 更新链接;那里也列出了调试。Sooo 我不确定为什么或如何调试 3.81;也许它的早期版本。另外我不确定为什么调试有效但不跟踪。我认为这是一个ndk问题。我所做的是直接发出 make ,不仅我看到跟踪工作;我没有看到促使我发布此问题的错误。这是所有与“:”和“::”一起使用的抱怨。

@Alex Cohn - 再次感谢。这解释了很多。我将首先考虑获取最新的ndk;然后尝试使用最新版本的make。对我来说,一个悬而未决的问题是,我试图移植到 jni 中的本机 C 项目使用 ndk 早期版本中的工具链之一进行编译。因此,对我来说,现在收到“::”错误消息似乎表明它是由其他原因引起的。我怀疑这与我试图将 C 项目的 make 文件包含到我的 Android.mk 中有关。虽然我的 Android.mk 没有一个 all 目标,但也许有一个暗示?我只是像报纸一样阅读了一次制作手册;我不记得是不是这样。但是有很多隐含的规则。你对此有什么想法吗?

0 投票
2 回答
4899 浏览

android - 保存 JNIEnv* 的最佳方法是什么

我有一个带有 JNI 的 Android 项目。在实现侦听器类的 CPP 文件中,有一个回调 x() 。当调用 x() 函数时,我想调用 java 类中的另一个函数。但是,为了调用该 java 函数,我需要访问 JNIEnv*。

我知道在回调的同一个cpp文件中,有一个函数:

我应该在调用时将 JNIEnv* 作为成员变量保存在 cpp 文件init(..)中吗?并在回调发生时使用它?

抱歉,我是 JNI 的初学者。

0 投票
1 回答
710 浏览

java-native-interface - JNI AttachCurrentThread 中的分段错误

希望你今天过得愉快。

我有一个带有以下代码的 JNI so 库。

我在进程中附加了一个调试器,它AttachCurrentThread导致了 JVM 中的 SEGFAULT。s_vm 在JNI_OnLoad被调用时是相同的值。

奇怪的是,相同的代码在 Windows 上工作,但在 CentOS6.5 上失败。我也尝试了与 Windows 上相同的 JRE 版本,但问题仍然存在。

我不确定这是否是由多个 GLIBC 版本引起的?

更新:我发现如果我从项目中删除灯笼,一切正常。但是如果我在项目中添加lanterna jar,甚至没有代码来调用它,就会发生这种情况。

lanterna 与 JNI 不兼容?

0 投票
1 回答
139 浏览

android - 应用程序进入前台时不调用 JNI 方法

我在我的应用程序中使用 JNI...当应用程序启动时它工作正常并且 JNI 日志正在打印..但是一旦应用程序进入后台并在使用其他一些应用程序后进入前台 JNI 日志不会打印并且方法不会被调用..

谁能建议我一个解决方案?

提前致谢..

0 投票
1 回答
2168 浏览

java-native-interface - 从 JNI 返回一个大对象数组?

根据文档

jint EnsureLocalCapacity(JNIEnv *env, jint 容量);

确保可以在当前线程中创建至少给定数量的本地引用。成功返回 0;否则返回负数并抛出 OutOfMemoryError。

在进入本机方法之前,VM 会自动确保至少可以创建 16 个本地引用。

为了向后兼容,VM 分配的本地引用超出了确保的容量。(作为调试支持,VM 可能会警告用户正在创建过多的本地引用。在 JDK 中,程序员可以提供 -verbose:jni 命令行选项来打开这些消息。)VM 调用 FatalError 如果不能再创建超出确保容量的本地引用。

似乎可以创建的本地引用的数量有一些限制。

而且我有以下代码来返回一个大对象数组,这会导致大量本地引用的创建。这是否意味着这很容易达到限制?-- 文档默认为 16。

如何延长限制?

0 投票
0 回答
38 浏览

java - JNI 程序的 UnsatisfiedLinkError

我与 JNI 合作,我遵循了https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-2.1中的所有内容

我运行java程序,它显示

我不知道如何解决这个问题?

0 投票
1 回答
204 浏览

java - JNIEnv->FindClass 返回空 OpenJDK 7,正确返回 Oracle JDK 8

是我的代码,其中 paramlines[l_paramlines-1] 被定义为“Clazz”,其中 Clazz 类中没有包声明。如果我使用 OpenJDK 7 jvm.dll,变量 cls 包含 NULL 结构,但如果我使用 Oracle JDK 8 jvm.dll,则返回正确的初始化结构。

更有趣的是,如果我的 JAR 仅包含“Clazz”类,OpenJDK 7 jvm.dll 可以正常工作,但如果我包含其他库(例如 FasterXML Jackson/Log4j2)则失败。我尝试在 IntelliJ 上使用 Maven 打包我的 jar,并在 Eclipse 上导出为 Runnable JAR。两者都不适用于 OpenJDK 7 jvm.dll。

我必须使用 OpenJDK 7 jvm.dll,所以我想知道这是 OpenJDK 的错误,还是我的 JAR 打包的错误。

我在各种情况下的 META-INF:Eclipse Runnable JAR,适用于 OpenJDK 7 jvm.dll,仅包含类 Clazz

Eclipse Runnable JAR(提取的类),OpenJDK 7 失败,运行 Oracle JDK 8,包含 Clazz + 库

IntelliJ Maven(提取类),OpenJDK 7 失败,运行 Oracle JDK 8,包含 Clazz + 库

0 投票
3 回答
3680 浏览

android - 为什么Android jvm->GetEnv() 为多个线程返回相同的“env”。?

jvm->GetEnv(&envThread, JNI_VERSION_1_6)用来获取多个线程的“env”以便进行多个envThread->GetMethodID()调用。两个线程都正确连接到 JVM。

我在第一个线程上调用“GetMethodID()”返回的函数没有问题,但是当第二个线程尝试调用时,我看到以下消息:

因为我对第二个线程的调用jvm->getEnv()返回JNI_OK,所以它已经附加(如预期的那样)。但出乎意料的是,返回的 JniENV 与第一个线程中的完全相同。从而导致崩溃。

有没有人见过这种东西?我很迷茫不知道该怎么办...

谢谢。

0 投票
2 回答
709 浏览

java - 使用参数 Map 调用 Java 函数来自带有 std::map 的 c++

当我在 c++ 中时,如何调用作为参数的Java函数。我知道当参数是简单类型(如 int 等)时如何从 C++ 调用 Java 函数,但如何调用 MapMap<String, String>C++std::map<std::string, std::string>

有什么诀窍可以做到这一点吗?

在 Java 函数中使用分隔的两个jobjectArrays of jstring并按索引粘合到 Map 还是有更优雅的解决方案?