我试图使用Java代码中的.NET DLL,成功加载了 tsMemberFunctions.DLL ,但是代码无法调用实际函数。
请参见下面的代码段
public class tsMemberFunctions {
public native void GetMemberJSONSample();
static {
System.loadLibrary("tsMemberFunctions");
System.out.println("Loaded");
}
public static void main(String[] args) {
new tsMemberFunctions().GetMemberJSONSample();
}
}
执行上述方法时,出现以下错误:
Loaded
Exception in thread "main" java.lang.UnsatisfiedLinkError: tsMemberFunctions.GetMemberJSONSample()V
at tsMemberFunctions.GetMemberJSONSample(Native Method)
at tsMemberFunctions.main(tsMemberFunctions.java:12)
有人可以告诉我我是否错过了代码中的任何内容或不正确的内容,或者针对此用例提出了更好的选择。 TIA。
答案 0 :(得分:0)
您必须非常注意名称和出口。
假设您有这个超级简单的库
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include "jni.h"
#include <stdio.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" JNIEXPORT void JNICALL Java_recipeNo001_HelloWorld_displayMessage
(JNIEnv* env, jclass obj) {
printf("Hello world!\n");
}
您必须确保为正确的体系结构构建DLL
(这取决于您使用的Java版本-32/64位)。
假设您有x64 DLL
和x64 JDK
,可以这样称呼您的音乐库
package recipeNo001;
public class HelloWorld {
public static native void displayMessage();
static {
System.load("C:\\Users\\your_name\\Source\\Repos\\HelloWorld\\x64\\Debug\\HelloWorld.dll");
}
public static void main(String[] args) {
HelloWorld.displayMessage();
}
}
对于您而言,我敢打赌您的代码中没有extern "C"
-这就是为什么JVM无法找到您的符号的原因。
在工具方面,我建议使用Visual Studio 2019(在创建DLL时)和IntelliJ for Java代码。
您可以在以下位置找到许多示例:http://jnicookbook.owsiak.org/和此处:https://github.com/mkowsiak/jnicookbook