Java C++;JNI不满意链接错误 我试图在C++中制作一个本地列表并在爪哇中使用它,我确信所有的东西都被声明为正确的,但是我得到了一个链接错误
Java异常:Java C++;JNI不满意链接错误 我试图在C++中制作一个本地列表并在爪哇中使用它,我确信所有的东西都被声明为正确的,但是我得到了一个链接错误,java,c++,c,java-native-interface,unsatisfiedlinkerror,Java,C++,C,Java Native Interface,Unsatisfiedlinkerror,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 {
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 __cplusplus
extern "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
}
#endif
typedef 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);
#endif
#包括
#包括“List.h”
#包括
#ifndef包含在JAVA列表中
#定义包含的JAVA列表
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:HelloJNI
*方法:你好
*签字:()五
*/
JNIEXPORT jlong JNICALL Java_Java_List_init_List(JNIEnv*,jobject,jobject);
JNIEXPORT作业对象JNICALL Java_Java_List_List_get(JNIEnv*env、作业对象thisObj、jint索引、jlong List);
#ifdef_uucplusplus
}
#恩迪夫
类型定义结构Java_列表Java_列表;
结构Java_列表
{
作废*清单;
jclass类型;
};
void init_Java_List(Java_List*jList,jclass类型);
jobject java_list_get(java_list*jList,int index);
#恩迪夫
C++源代码
#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;
}
jobject java_list_get(Java_List *jList, int index)
{
List<jobject> *list = (List<jobject> *) jList->list;
return *(list->get(index));
}
#包括
#包括“Java_List.h”
#包括“pch.h”
外部“C”
{
JNIEXPORT jlong JNICALL Java_Java_List_init_List(JNIEnv*env,jobject thisObj,jobject类类型)
{
jclass type=env->GetObjectClass(类类型);
Java_List*List=(Java_List*)malloc(sizeof(Java_List));
初始化Java_列表(列表,类型);
返回(jlong)列表;
}
JNIEXPORT作业对象JNICALL Java\u Java\u List\u List\u get(JNIEnv*env、作业对象thisObj、jint索引、jlong列表)
{
返回java\u list\u get((java\u list*)list,(int)index);
}
}
/*JNIAPI*/
void init_Java_List(Java_List*jList,jclass类型)
{
jList->list=malloc(sizeof(list));
新建(jList->list)列表();
jList->type=type;
}
jobject java_list_get(java_list*jList,int index)
{
列表*列表=(列表*)jList->List;
返回*(列表->获取(索引));
}
我正在使用VisualStudio进行这个项目,这个项目构建了多个文件,不仅仅是dll,我不知道这是否是问题所在。
您的Java类名和方法名包含下划线,这违反了命名约定
如果你坚持保存它们,你需要把C++函数的名称改为<代码> javajjava1ListIn ItIL1List。请注意
List
和List
之前的1
s,它告诉链接器将前面的下划线解释为文字下划线字符,而不是命名分隔符。dll是否包含Java正在寻找的符号?使用[dependency explorer]()检查是否使用javah
工具生成这些JNI函数签名?还是新的javac
选项?还是你亲手制作的?如果是,为什么?