您好,我目前正在从事一个将 C++ 框架集成到 Java 程序中的项目,因此我开始探索 JNI。由于我是 C++ 的新手,我目前正在努力处理类型转换以及应该在 java native 方法中声明哪些参数类型。
在cpp文件中我有以下方法:
using namespace std;
int main(int argc,char**argv)
{
//do stuff
}
我对应的 java 类如下所示:
public class JniTest {
static {
System.loadLibrary("plain2snt");
}
public JniTest() {
char[][] arguments = new char[][] {"resourceFile1.txt".toCharArray(), "resourceFile2.txt".toCharArray()};
main(2, arguments);
}
public native int main(int argc, char[][] argv);
}
java类的头文件如下:
#include <jni.h>
/* Header for class testPackage_JniTest */
#ifndef _Included_testPackage_JniTest
#define _Included_testPackage_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testPackage_JniTest
* Method: main
* Signature: (I[[C)I
*/
JNIEXPORT jint JNICALL Java_testPackage_JniTest_main
(JNIEnv *, jobject, jint, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
当我尝试运行它时,出现以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError:
testPackage.JniTest.main(I[Ljava/lang/String;)I
at testPackage.JniTest.main(Native Method)
at testPackage.JniTest.<init>(JniTest.java:14)
at testPackage.Main.main(Main.java:6)
我已经使用谷歌、JNI API 引用等查找 Java 和 C++ 之间的类型匹配,但找不到如何在 Java 中处理指向指针类型的字符指针。 Java 类中的 argv 参数与 cpp 框架中的 char** 匹配的实际类型定义是什么?
最佳答案
当 JVM 尝试调用 native 方法时 - 它期望您已将其实现为指向使用 javah
生成的 header 的函数。 IE。你的图书馆某处必须包含
JNIEXPORT jint JNICALL Java_testPackage_JniTest_main
(JNIEnv *, jobject, jint, jobjectArray) {
/* do stuff */
}
捕获到的异常是一个声明,没有本地方法的实现。
接下来,传递 arguments
不是 array-of-array-of-char 而是 String
的数组要方便得多。
public JniTest() {
String[] arguments = new String[] {"resourceFile1.txt", "resourceFile2.txt"};
main(2, arguments);
}
public native int main(int argc, String[] argv);
}
在 C++ 中,您可以通过以下方式获取 args:
JNIEXPORT jint JNICALL Java_testPackage_JniTest_main (JNIEnv *, jobject thiz, jint argc, jobjectArray argv) {
for(jsize i = 0; i < env->GetArrayLength(argv); i++) {
jstring str = (jstring)env->GetObjectArrayElement(argv, i);
const char *c_str = env->GetStringUTFChars(str, NULL);
/* do whatever you want with c_str */
env->ReleaseStringUTFChars(str, c_str);
}
/* ... */
}
关于Java JNI UnsatisfiedLinkError C char 指针指向指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38308286/