gpt4 book ai didi

java - 用于 C++ 实现的 native JNI 静态方法的 Java 运行时错误

转载 作者:行者123 更新时间:2023-11-28 04:03:52 25 4
gpt4 key购买 nike

我有一个 two simple implementations 的 repo 协议(protocol)适用于 C/C++ 的 JNI。
我有 C++ 静态 JNI 方法的 java.lang.UnsatisfiedLinkError 错误。

(base) GlushenkovYuri:java y.glushenkov$ /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/bin/java -Djava.library.path=. MyJNIExample
Hello World from C!
Exception in thread "main" java.lang.UnsatisfiedLinkError: MyJNIExample.sayHelloCpp()V
at MyJNIExample.sayHelloCpp(Native Method)
at MyJNIExample.main(MyJNIExample.java:51)

但对于 C native 方法,同样的方法效果很好。对于 C++,无需 static 即可工作。

您可以通过以下方式重现相同的行为:
1) 取消注释行 the static native method for C++this one .并用 the NON static native method for C++ 注释行和 this one ;
2) 然后执行我的 README.md 中描述的后续步骤文件;

有人可以向我解释为什么本地方法静态/非静态适用于 C,但只有本地非静态方法适用于 C++吗?

UPD:我的header文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyJNIExample */

#ifndef _Included_MyJNIExample
#define _Included_MyJNIExample
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MyJNIExample
* Method: sayHelloC
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_MyJNIExample_sayHelloC
(JNIEnv *, jclass);

/*
* Class: MyJNIExample
* Method: sayHelloCpp
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_MyJNIExample_sayHelloCpp
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

最佳答案

javah 生成的函数类型根据native 方法是否为static 而不同:

JNIEXPORT void JNICALL Java_MyJNIExample_sayHelloCppstatic
(JNIEnv *, jclass);

JNIEXPORT void JNICALL Java_MyJNIExample_sayHelloCppnonstatic
(JNIEnv *, jobject);

此外,生成的 header 包含一个 extern "C" 声明,以确保编译器保持名称完好无损,就像 __Z29Java_MyJNIExample_sayHelloCppP7JNIEnv_P8_jobject 一样。

所以,这里发生的是你生成了一个带有static native void sayHelloCpp的头文件,所以有一个带有签名的函数的extern "C"声明(JNIEnv *, jclass),但是你提供一个(JNIEnv *, jobject)函数。由于签名不匹配,编译器使用其默认的修改方案,并且 Java 运行时无法找到它。

所以,长话短说:始终如果您更改了 Java 类,则重新生成您的头文件并检查 C++ 函数签名。我无法重现您的问题,因为我编写了一个始终在重新编译 Java 文件后重新生成头文件的 Makefile。

关于java - 用于 C++ 实现的 native JNI 静态方法的 Java 运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59070023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com