java - C++ JNI UnsatisfiedLinkError

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

我正在尝试在 c++ 中创建一个 native 列表并在 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;
}

jobject java_list_get(Java_List *jList, int index)
{
    List<jobject> *list = (List<jobject> *) jList->list;
    return *(list->get(index));
}

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

最佳答案

您的 Java 类名和方法名包含下划线,这违反了命名约定。

如果您坚持保留它们,则需要将 C++ 函数的名称更改为 Java_Java_1List_init_1list。请注意 Listlist 之前的 1,它告诉链接器将前面的下划线解释为文字下划线字符而不是命名分隔符。

关于java - C++ JNI UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58091679/

相关文章:

java - Delphi与Java的套接字通信

java - 什么是NullPointerException,我该如何解决?

java - 仅当不存在 key1=value1 且 key2=value3 的另一个文档时,如果 key1=value1 且 key2=value2 则从弹性获取所有文档

java - 处理来自 superfeedr 的重复通知

ios - 当字节通过不同的平台时,如何使字节按正确的顺序排列?

java - 我应该如何订购 if 语句?

c++ - 值不保存在数组 C++ 中

c++ - 最多 3 个值,左关联版本与右关联版本的性能

c - 使用 GCC 生成 a.out 文件格式

c - 如何在 linux 中获取当前进程名称?