我使用 JNI 的 java 应用程序崩溃,hs_err_pid 文件给出错误“异常访问冲突”。操作系统是Windows VISTA。
据我所知,我的本机代码非法写入不属于它的内存块。
我过去曾在 Linux 上的纯本机代码上使用 valgrind 来检测此类问题。
但是当使用java时,valgrind就会失败并且无法工作。
您建议使用什么(如果有)方法来识别有问题的代码?
我不可能手动挖掘本机代码(几百万行)来识别它。
问题是找出哪些 Java 函数调用某个 JNI 函数。在 Java 中,这可以通过 来实现new Exception.printStackTrace(),但这必须通过本机 (JNI) 函数来完成。
由于稍后找到自己的代码的最简单方法是将其发布在“网络”中,因此我同时发布了问题和答案。
因此,我有针对不同 CPU 构建的本机代码。我不想作为库加载,我想通过runtime.exec(...) 执行二进制文件。
有没有办法将它们放在 Android 处理 CPU 限定符的某个地方?或者我必须制作不同的 APK 吗?
我想在 Qt 中使用 JNI 调用 Android Java 方法。有一个我无法理解的奇怪的“方法签名”参数。这是什么,我应该如何设置?
在示例中,它类似于(II)Ior (I)I。这是什么意思?
例如:
jint max = QAndroidJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b);
Run Code Online (Sandbox Code Playgroud) 我已经看过这个http://www.javacodegeeks.com/2011/10/gpgpu-with-jcuda-good-bad-and-ugly.html,它说我必须修改我的内核以只获取一维数组。但是我拒绝相信在 JCuda 中创建结构并将其复制到设备内存是不可能的。
我想通常的实现是创建一个扩展一些本机 api 的 case 类(scala 术语),然后可以将其转换为可以安全地传递到内核中的结构。不幸的是我没有在谷歌上找到任何东西,因此问题。
我正在编写一个 JNI 来从 Java 调用 C++ 代码。当我使用NewStringUTF()时它已经崩溃了。这是我的代码:
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 3 is %d", 3);
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of id is %s", id.c_str());
jstring jsId = m_env->NewStringUTF(id.c_str());// CODE CRASHES HERE
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "The value of 4 is %d", 4);
Run Code Online (Sandbox Code Playgroud)
输出是:
V/myapplication ( 4930): The value of 3 is 3
V/myapplication( 4930): The value of id is 999999999999@example.example.net
F/art ( 4930): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: thread Thread[12,tid=5100,Native,Thread*=0xa1033400,peer=0x12c5b0e0,"QtThread"] using JNIEnv* from thread Thread[17,tid=5359,Runnable,Thread*=0xb4e0ac00,peer=0x12e37080,"Thread-161252"]
F/art ( 4930): …Run Code Online (Sandbox Code Playgroud) 如何比较 c 语言中的两个 jstrings。我需要这个来执行 jni,其中逻辑写在 .c 文件中用于比较两个名称
我在 Java 加载本机 dll 时遇到问题,因为它发生在 64 位 Windows 7 上。FWIW 包是 ZeroMQ,但重要的是该 jar 需要加载本机 dll,称为 jzmq.dll。这又取决于 libzmq.dll (和一些标准库)。我已将两个 dll 复制到 target/lib 并设置java.language.path为 target/lib。
如果我写:
System.loadLibrary("jzmq");
Run Code Online (Sandbox Code Playgroud)
我得到UnsatisfiedLinkError一个Can't find dependent libraries. 但是如果我说
System.loadLibrary("libzmq");
System.loadLibrary("jzmq");
Run Code Online (Sandbox Code Playgroud)
然后就没问题了,jzmq.dll加载成功。
在随附的 jar 中,它就包含在内System.loadLibrary("jzmq"),我不想在代码中摆弄依赖项。我不清楚为什么依赖项不会自动加载,也不清楚我需要做什么才能让它正常工作。
预先感谢您的任何帮助!
因此,如果我有一个jobjectfrom jclassclazz1并且我想将其类型转换为 jclass clazz2。该怎么做呢?
我检查了Oracle JNI 文档,唯一对转换的引用来自该函数IsAssignableFrom(),但仅此而已。
我正在尝试onEventChannel通过 JNI调用C++:
class MainActivity: FlutterActivity(){
companion object {
@JvmStatic
private fun onEventChannel(b: ByteArray): Int {
Log.d(TAG, "onEventChannel");
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我试着(Ljava/lang/byte;)I和(Ljava/lang/ByteArray;)I对onEventChannel,但他们没有工作。
java的签名是ByteArray什么?