gpt4 book ai didi

java - JNI Hello World 不满意的链接错误

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:22 24 4
gpt4 key购买 nike

这是我第一次尝试 JNI。我的最终目标是让所有任务当前在一台机器上运行,但需要运行一个简单的示例。当我尝试执行我的主程序时,我不断收到此错误。我提供了我的简单 Java 主程序、生成的头文件和错误。

我不知道这个 DLL 可能依赖于什么。它最初引用了一个我跟踪并放入 system32 (msvcr90.dll) 的 DLL。

这是我用来编译 C 代码以及生成 DLL、OBJ、LIB、EXP 和 list 文件的命令。

cl -I"C:\Program Files\Java\jdk1.6.0\include"-I"C:\Program Files\Java\jdk1.6.0\include\win32"-MD -LD HelloWorld.c -FeHelloWorld.动态链接库

class HelloWorld {
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
static {
System.load("C:\\temp\\HelloWorld.dll");
}
}


#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"

JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}

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

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

java.lang.UnsatisfiedLinkError: C:\temp\HelloWorld.dll: A dynamic link library (DLL) initialization routine failed
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at HelloWorld.<clinit>(HelloWorld.java:7)
Exception in thread "main"

最佳答案

Unsatisfied Link Error 可能意味着很多事情都出错了。我会用

System.loadLibrary("HelloWorld");

代替

System.load();

正如 TwentyMiles 所建议的那样。

此外,在调用您的程序时,您需要(假设您的 DLL 与您的类文件位于同一目录中:

java -Djava.library.path=. Hello World

这是我制作的一个调用 Win32 API 函数 (MessageBox) 的简单演示

Java类

class CallApi{
private native String showMessageBox(String msg);
private native double getRandomDouble();

static{
try{
System.loadLibrary("CallApi");
System.out.println("Loaded CallApi");
}catch(UnsatisfiedLinkError e){
//nothing to do
System.out.println("Couldn't load CallApi");
System.out.println(e.getMessage());
}
}

public static void main(String args[]){
CallApi api = new CallApi();
double randomNumber = api.getRandomDouble();
String retval = api.showMessageBox("Hello from Java!\n"+
"The native random number: "+randomNumber);
System.out.println("The native string: "+retval);
}
}

生成的头文件

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

#ifndef _Included_CallApi
#define _Included_CallApi
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: CallApi
* Method: showMessageBox
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *, jobject, jstring);

/*
* Class: CallApi
* Method: getRandomDouble
* Signature: ()D
*/
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

C DLL代码

#include "CallApi.h"
#include <windows.h>
#include <stdlib.h>
#include <time.h>

#pragma comment(lib,"user32.lib")

JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *env, jobject thisObject, jstring js)
{
//first convert jstring to const char for use in MessageBox
const jbyte* argvv = (*env)->GetStringUTFChars(env, js, NULL);
char* argv =(char *) argvv;

//Call MessageBoxA
MessageBox(NULL, argv, "Called from Java!", MB_ICONEXCLAMATION | MB_OK);
return js;
}

JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *env, jobject thisObject)
{
double num1;
srand((unsigned)(time(0)));
num1 = ((double)rand()/(double)RAND_MAX);

return num1;
}

编译说明

我使用 Visual C++ express 2008 cl 进行编译,删除了 -ML 标志,因为它会在 Java 代码尝试调用 native 代码时导致异常:

cl/I"c:\Program Files\Java\jdk1.6.0_10\include"/I"c:\Program Files\Java\jdk1.6.0_10\include\win32"-LD CallApi.c -FeCallApi.动态链接库

然后,运行代码:

java -Djava.library.path=.调用接口(interface)

关于java - JNI Hello World 不满意的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1358541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com