问题标签 [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.
android - Android NDK,并将函数放在活动类之外
文章中提到: http ://androidcookbook.com/Recipe.seam?recipeId=77
是:
"在 Activity 类中,在任何方法之外:
"
如果设计师想要将所有 NDK 操作(加载库、定义函数)放在活动之外,她/他可以吗?
我试图通过创建一个新类并将其导入活动来解决这个问题。我将加载库放在类构造函数中,并将方法定义放在另一个类中。该活动似乎加载了库,但会崩溃,并出现找不到函数的错误
编辑以添加详细信息:我再次尝试了此操作,但将 loadLibrary 函数放回了 Activity 中。我得到相同的崩溃报告: java.lang.UnsatisfiedLinkError: Native method not found:
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 目标,但也许有一个暗示?我只是像报纸一样阅读了一次制作手册;我不记得是不是这样。但是有很多隐含的规则。你对此有什么想法吗?
android - 保存 JNIEnv* 的最佳方法是什么
我有一个带有 JNI 的 Android 项目。在实现侦听器类的 CPP 文件中,有一个回调 x() 。当调用 x() 函数时,我想调用 java 类中的另一个函数。但是,为了调用该 java 函数,我需要访问 JNIEnv*。
我知道在回调的同一个cpp文件中,有一个函数:
我应该在调用时将 JNIEnv* 作为成员变量保存在 cpp 文件init(..)
中吗?并在回调发生时使用它?
抱歉,我是 JNI 的初学者。
java-native-interface - JNI AttachCurrentThread 中的分段错误
希望你今天过得愉快。
我有一个带有以下代码的 JNI so 库。
我在进程中附加了一个调试器,它AttachCurrentThread
导致了 JVM 中的 SEGFAULT。s_vm 在JNI_OnLoad
被调用时是相同的值。
奇怪的是,相同的代码在 Windows 上工作,但在 CentOS6.5 上失败。我也尝试了与 Windows 上相同的 JRE 版本,但问题仍然存在。
我不确定这是否是由多个 GLIBC 版本引起的?
更新:我发现如果我从项目中删除灯笼,一切正常。但是如果我在项目中添加lanterna jar,甚至没有代码来调用它,就会发生这种情况。
lanterna 与 JNI 不兼容?
android - 应用程序进入前台时不调用 JNI 方法
我在我的应用程序中使用 JNI...当应用程序启动时它工作正常并且 JNI 日志正在打印..但是一旦应用程序进入后台并在使用其他一些应用程序后进入前台 JNI 日志不会打印并且方法不会被调用..
谁能建议我一个解决方案?
提前致谢..
java-native-interface - 从 JNI 返回一个大对象数组?
根据文档
jint EnsureLocalCapacity(JNIEnv *env, jint 容量);
确保可以在当前线程中创建至少给定数量的本地引用。成功返回 0;否则返回负数并抛出 OutOfMemoryError。
在进入本机方法之前,VM 会自动确保至少可以创建 16 个本地引用。
为了向后兼容,VM 分配的本地引用超出了确保的容量。(作为调试支持,VM 可能会警告用户正在创建过多的本地引用。在 JDK 中,程序员可以提供 -verbose:jni 命令行选项来打开这些消息。)VM 调用 FatalError 如果不能再创建超出确保容量的本地引用。
似乎可以创建的本地引用的数量有一些限制。
而且我有以下代码来返回一个大对象数组,这会导致大量本地引用的创建。这是否意味着这很容易达到限制?-- 文档默认为 16。
如何延长限制?
java - JNI 程序的 UnsatisfiedLinkError
我与 JNI 合作,我遵循了https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-2.1中的所有内容
我运行java程序,它显示
我不知道如何解决这个问题?
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 + 库
android - 为什么Android jvm->GetEnv() 为多个线程返回相同的“env”。?
我jvm->GetEnv(&envThread, JNI_VERSION_1_6)
用来获取多个线程的“env”以便进行多个envThread->GetMethodID()
调用。两个线程都正确连接到 JVM。
我在第一个线程上调用“GetMethodID()”返回的函数没有问题,但是当第二个线程尝试调用时,我看到以下消息:
因为我对第二个线程的调用jvm->getEnv()
返回JNI_OK
,所以它已经附加(如预期的那样)。但出乎意料的是,返回的 JniENV 与第一个线程中的完全相同。从而导致崩溃。
有没有人见过这种东西?我很迷茫不知道该怎么办...
谢谢。
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 还是有更优雅的解决方案?