Java JNI UnsatisfiedLinkError C char 指针指向指针

标签 java c++ types java-native-interface

您好,我目前正在从事一个将 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/

相关文章:

java - 什么是 "non-blocking"并发,它与普通并发有何不同?

java - 使用外部 jar 文件从命令行运行 java 应用程序

java - 从文件加载大 HashMap<String, TreeMap> 会给出 java.lang.OutOfMemoryError(超出 GC 开销限制)

java - Spring行为中的@async是同步的

c++ - 如何要求重新启动 firefox?

c - 枚举C中的基本数据类型,以便于访问大小

c - Go 的 interface{} 和 C 中的 void* 一样吗?

python - 在 C++ 中嵌入 Cython 类方法

c++ - 什么时候应该使用this->?

types - 如何在结构上定义可变字段?去