java.lang.unsatifiedlinkerror:org.thotheolh.jche.NativeBridge.loadPKCS11Module(Ljava/lang/String;)V

java.lang.unsatifiedlinkerror:org.thotheolh.jche.NativeBridge.loadPKCS11Module(Ljava/lang/String;)V,java,java-native-interface,Java,Java Native Interface,我已经查看了StackOverFlow和其他搜索引擎中的UnsatifiedLinkError帮助,但是解决方案并没有满足问题,所以我将在这里说明它们 我试图对PKCS11 DLL库进行JNI调用,但出现以下错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: org.thotheolh.jche.NativeBridge.loadPKCS11Module(Ljava/lang/String;)V at org.thothe

我已经查看了StackOverFlow和其他搜索引擎中的UnsatifiedLinkError帮助,但是解决方案并没有满足问题,所以我将在这里说明它们

我试图对PKCS11 DLL库进行JNI调用,但出现以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.thotheolh.jche.NativeBridge.loadPKCS11Module(Ljava/lang/String;)V
at org.thotheolh.jche.NativeBridge.loadPKCS11Module(Native Method)
at org.thotheolh.jche.NativeBridge.load(NativeBridge.java:40)
at org.thotheolh.jche.NativeBridge.<init>(NativeBridge.java:29)
at org.thotheolh.jche.exception.test.PKCS11GenericTest.main(PKCS11GenericTest.java:27)
Java Result: 1
javah生成的头文件片段:

JCHE.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_thotheolh_jche_NativeBridge */

#ifndef _Included_org_thotheolh_jche_NativeBridge
#define _Included_org_thotheolh_jche_NativeBridge
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_thotheolh_jche_NativeBridge
 * Method:    loadPKCS11Module
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_org_thotheolh_jche_NativeBridge_loadPKCS11Module
 (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif
/*不要编辑此文件-它是机器生成的*/
#包括
/*类org_thotheolh_jche_NativeBridge的标题*/
#如果NDEF包括国家桥梁的组织结构
#定义-包括组织-思想-国家桥梁
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*班级:org_thotheolh_jche_NativeBridge
*方法:loadPKCS11Module
*签名:(Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_thotheolh_jche_NativeBridge_loadPKCS11模块
(JNIEnv*,jobject,jstring);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
C文件片段:

JCHE.c

#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include "JCHE.h"

const char *pkcs11ModuleFileLoc;
HMODULE pkcs11;

JNIEXPORT void JNICALL Java_org_thotheolh_jche_NativeBridge_loadPKCS11Module
(JNIEnv *env, jobject obj, jstring location) {
    printf("inside native method\n");
    pkcs11ModuleFileLoc = (*env)->GetStringUTFChars(env, location, (jboolean *)0);
    printf("%s", pkcs11ModuleFileLoc);
    //pkcs11 = LoadLibraryA(pkcs11ModuleFileLoc);
    //printf("\nLoaded PKCS11 Lib");
}
#包括
#包括
#包括
#包括
#包括“JCHE.h”
常量字符*pkcs11ModuleFileLoc;
HMODULE pkcs11;
JNIEXPORT void JNICALL Java_org_thotheolh_jche_NativeBridge_loadPKCS11模块
(JNIEnv*env、jobject对象、jstring位置){
printf(“内部本机方法\n”);
pkcs11ModuleFileLoc=(*env)->GetStringUTFChars(env,location,(jboolean*)0;
printf(“%s”,pkcs11ModuleFileLoc);
//pkcs11=LoadLibraryA(pkcs11ModuleFileLoc);
//printf(“\n加载的PKCS11库”);
}

我曾尝试在Java中检查加载的库,发现它们已经加载,但不知何故,我得到了所描述的错误,尽管我查看了许多其他方法来尝试解决这个问题

我尝试了,但无法重现您的问题(但我使用了Linux并将
System.loadLibrary(“libJPKCS11”);
更改为
System.loadLibrary(“JPKCS11”);
,请参见下文,但我确信这不会导致您的问题,因为错误消息会有所不同)

您收到的错误消息意味着可以加载库,因此对
System.loadLibrary()
的调用没有问题

您是否确定
JCHE.obj
libJPKCS11.dll
的成员,即
libJPKCS11.dll
链接正确,并且
JCHE.obj
使用正确的标志创建dll?在我看来,该消息似乎正确加载了库,但不包含函数
Java\u org\u thotheolh\u jche\u NativeBridge\u loadPKCS11Module()
。因此,您可能需要检查
libJPKCS11.dll
是否确实是“完整的”和“最新的”


顺便说一下,您可以考虑删除<代码> LIB <代码>前缀>。代码>系统。loadLibrary负责前缀和后缀。您只能使用
System.loadLibrary(“foo”)。然后在POSIX上加载
libfoo.so
,在Windows上加载
foo.dll
。否则它会尝试在POSIX上加载
libfoo.so
,这感觉很奇怪。

找到了一个非常旧的2012 Netbeans帖子来解决这个问题。这是由于在生成DLL文件时缺少一些GCC编译器选项造成的

其他GCC编译器选项:

-Wl,--export-all-symbols -Wl,--add-stdcall-alias 
参考:

顺便说一句,JCHE.c打包为libJPKCS11.dll,对于那些想知道NativeBridge.java中的“私有字符串pkcs11JavaWrapper=“libJPKCS11”;“代码行”的人来说,类路径已经正确设置。请准确引用错误消息。您的标题不正确。生成的DLL文件被故意命名为“libJPKCS11.DLL”。有什么影响吗?我使用了一个DLL查看工具,它向我显示了libJPKCS11.DLL中的正确函数。将DLL的名称更改为JPKCS11.DLL仍然无法修复它。正如我所说,这不是问题所在,这只是一个建议。检查
JCHE.obj
是否正确构建并包含在
libJPKCS11.dll
中。我使用nirsoft中的dllexport.exe查看dll,它显示:“Java\u org\u thotheolh\u JCHE\u NativeBridge”_loadPKCS11Module@120x635c1280 0x00001280 69(0x45)JPKCS11.dll C:\Users\XXXXXX\Documents\NetBeansProjects\JPKCS11\dist\JPKCS11.dll导出函数”. 好像它在DLL里面。那我就没主意了。很抱歉如果其他人发现了问题,我会在其他人发现问题时删除我的答案。这就是所谓的“使用正确的标志创建DLL”。)
-Wl,--export-all-symbols -Wl,--add-stdcall-alias