我正在使用Windows上的Eclipse创建一个简单的JNI测试应用程序。我的C++编译器是MinGW 4.6.2。当我尝试调用我的测试DLL中的函数时(DLL本身可以正常加载),Java会抛出一个“UnsatisfiedLinkError”。我已经验证了我的DLL导出了一个与由“javah”实用程序生成的函数同名的“C”函数。
尝试调用该函数如何可能生成链接错误?(此外,是否有任何方法可以获得有关未找到哪个符号的更多详细信息?仅有一个“UnsatisfiedLinkError”的简单声明几乎没有用处。)
以下是定义本地函数的Java代码:
以下是
尝试调用该函数如何可能生成链接错误?(此外,是否有任何方法可以获得有关未找到哪个符号的更多详细信息?仅有一个“UnsatisfiedLinkError”的简单声明几乎没有用处。)
以下是定义本地函数的Java代码:
package com.xyz.jsdi_test;
import java.io.File;
public class JSDI
{
public static native void func(
String str,
int i,
Integer ii,
long j /* 64 bits */,
Long jj,
byte[] b
);
public static void dummy()
{
System.out.println("JSDI.dummy()");
}
static
{
File f = new File("..\\jsdi\\bin\\jsdi.dll");
System.out.println("Preparing to load: " + f);
System.load(f.getAbsolutePath());
System.out.println("Successfully loaded: " + f);
}
以下是javah
的相应输出:
...
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_xyz_jsdi_test_JSDI
* Method: func
* Signature: (Ljava/lang/String;ILjava/lang/Integer;JLjava/lang/Long;[B)V
*/
JNIEXPORT void JNICALL Java_com_xyz_jsdi_1test_JSDI_func
(JNIEnv *, jclass, jstring, jint, jobject, jlong, jobject, jbyteArray);
#ifdef __cplusplus
}
#endif
...以及我如何实现这个函数...:
extern "C"
{
JNIEXPORT void JNICALL Java_com_xyz_jsdi_1test_JSDI_func(
JNIEnv * env,
jclass _class,
jstring str,
jint i,
jobject ii,
jlong j,
jobject jj,
jbyteArray b
)
{
// don't do anything...let's just try to get called successfully...
}
} // extern "C"
这是我尝试调用它的方法。
...
public static void main(String[] args)
{
JSDI.dummy(); // cause class to load, which should cause System.load() to run.
JSDI.func("hello", 0, 0, 0L, 0L, (byte[])null);
}
最后,这是输出结果:
Preparing to load: ..\jsdi\bin\jsdi.dll
Successfully loaded: ..\jsdi\bin\jsdi.dll
JSDI.dummy()
java.lang.UnsatisfiedLinkError: com.xyz.jsdi_test.JSDI.func(Ljava/lang/String;ILjava/lang/Integer;JLjava/lang/Long;[B)V
at com.xyz.jsdi_test.JSDI.func(Native Method)
at com.xyz.jsdi_test.SimpleTest.main(SimpleTest.java:24)
javah
想在其前面加上“1”)。此外,我创建了一个不带参数的非静态成员函数,并在尝试调用new JSDI().mf();
时出现了相同的错误。 - 0xbe5077ed