我正在尝试在 c++ 中创建一个本机列表并在 java 中使用它,我相当确定所有内容都声明正确,但我收到链接错误Java异常:Exception in thread "main" java.lang.UnsatisfiedLinkError: Java_List.init_list(Ljava/lang/Object;)J at Java_List.init_list(Native Method) at Java_List.main(Java_List.java:13)Java源码public class Java_List{ static { System.loadLibrary("JAVA_JNI_FTC"); } public native long init_list(Object a); public static void main(String[] args) { Java_List list = new Java_List(); System.out.println(list.init_list(list)); }}头文件#include <jni.h>#include "List.h"#include <new>#ifndef _Included_JAVA_LIST#define _Included_JAVA_LIST#ifdef __cplusplusextern "C" {#endif /* * Class: HelloJNI * Method: sayHello * Signature: ()V */ JNIEXPORT jlong JNICALL Java_Java_List_init_list(JNIEnv *, jobject, jobject); JNIEXPORT jobject JNICALL Java_Java_List_list_get(JNIEnv *env, jobject thisObj, jint index, jlong list);#ifdef __cplusplus}#endiftypedef struct Java_List Java_List;struct Java_List{ void *list; jclass type;};void init_Java_List(Java_List *jList, jclass type);jobject java_list_get(Java_List *jList, int index);#endifC++源码#include <jni.h>#include "Java_List.h" #include "pch.h"extern "C"{ JNIEXPORT jlong JNICALL Java_Java_List_init_list(JNIEnv *env, jobject thisObj, jobject classType) { jclass type = env->GetObjectClass(classType); Java_List *list = (Java_List *)malloc(sizeof(Java_List)); init_Java_List(list, type); return (jlong)list; } JNIEXPORT jobject JNICALL Java_Java_List_list_get(JNIEnv *env, jobject thisObj, jint index, jlong list) { return java_list_get((Java_List *)list, (int)index); }}/* jni api*/void init_Java_List(Java_List *jList, jclass type){ jList->list = malloc(sizeof(List<jobject>)); new (jList->list) List<jobject>(); jList->type = type;}我在这个项目中使用 Visual Studio,该项目构建多个文件而不仅仅是 dll,我不知道这是否是问题。 文件
1 回答
潇湘沐
TA贡献1816条经验 获得超6个赞
Java 类名和方法名包含下划线,这违反了命名约定。
如果您坚持保留它们,则需要将 C++ 函数的名称更改为Java_Java_1List_init_1list
. 请注意和1
之前的 s ,它告诉链接器将前面的下划线解释为文字下划线字符而不是命名分隔符。List
list
添加回答
举报
0/150
提交
取消