猿问

C++ JNI UnsatisfiedLinkError

我正在尝试在 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 __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

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;

}


我在这个项目中使用 Visual Studio,该项目构建多个文件而不仅仅是 dll,我不知道这是否是问题。 文件


森林海
浏览 195回答 1
1回答

潇湘沐

Java 类名和方法名包含下划线,这违反了命名约定。如果您坚持保留它们,则需要将 C++ 函数的名称更改为Java_Java_1List_init_1list.&nbsp;请注意和1之前的 s&nbsp;,它告诉链接器将前面的下划线解释为文字下划线字符而不是命名分隔符。Listlist
随时随地看视频慕课网APP

相关分类

Java
我要回答