我想爲第三方DLL製作Java包裝。我創建了自己的DLL,充當JNI和第三方DLL之間的中間人。在Java中我加載這個DLL很好,但返回錯誤java.lang.UnsatisfiedLinkError: sixense.Sixense.init()Z
。什麼可能導致這個錯誤,我該如何正確調試它?當調用本地方法時返回java.lang.UnsatisfiedLinkError
Main.java:
package sixense_test;
import sixense.ControllerData;
import sixense.Sixense;
public class Main {
public static ControllerData[] controllers = new ControllerData[4];
public static boolean quit;
public static void main(String[] args) {
if(Sixense.init()) {
Sixense.setActiveBase(0);
Sixense.getAllNewestData(controllers);
System.out.println("X: " + controllers[0].pos[0] + "Y: " + controllers[0].pos[1] + "Z: " + controllers[0].pos[2]);
}
}
}
Sixense.java:
package sixense;
public class Sixense {
public static native boolean init();
public static native boolean exit();
public static native int getMaxBases();
public static native boolean setActiveBase(int base_num);
public static native boolean isBaseConnected(int base_num);
public static native int getMaxControllers();
public static native int getNumActiveControllers();
public static native boolean isControllerEnabled(int controller_id);
public static native boolean getAllNewestData(ControllerData[] all_data);
public static native boolean getAllData(int index_back, ControllerData[] all_data);
public static native boolean getNewestData(int controller_id, ControllerData data);
public static native boolean getData(int controller_id, int index_back, ControllerData all_data);
public static native int getHistorySize();
public static native boolean setFilterEnabled(boolean on_or_off);
public static native boolean getFilterEnabled();
public static native boolean setFilterParams(float near_range, float near_val, float far_range, float far_val);
public static native boolean getFilterParams(float[] params);
public static native boolean triggerVibration(int controller_id, int duration, int pattern_id);
public static native boolean autoEnableHemisphereTracking(int controller_id);
public static native boolean setHighPriorityBinding(boolean on_or_off);
public static native boolean getHighPriorityBinding();
public static native boolean setBaseColor(int red, int green, int blue);
public static native boolean getColorBase(int[] colors);
static {
System.loadLibrary("Sixense_Java");
}
}
從sixense_Sixense.cpp的摘錄:
#include <jni.h>
#include <sixense.h>
#include "sixense_Sixense.h"
JNIEXPORT jboolean JNICALL Java_sixense_Sixense_init(JNIEnv *env, jclass obj) {
int i;
i = sixenseInit();
return (i == -1) ? JNI_FALSE : JNI_TRUE;
}
從sixense_Sixense.h的摘錄:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class sixense_Sixense */
#ifndef _Included_sixense_Sixense
#define _Included_sixense_Sixense
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: sixense_Sixense
* Method: init
* Signature:()Z
*/
JNIEXPORT jboolean JNICALL Java_sixense_Sixense_init
(JNIEnv *, jclass);
從DUMPBIN
輸出:
File Type: DLL
Section contains the following exports for Sixense_Java.dll
00000000 characteristics
4FFBC481 time date stamp Tue Jul 10 01:58:25 2012
0.00 version
1 ordinal base
23 number of functions
23 number of names
ordinal hint RVA name
1 0 00001D10 [email protected]
2 1 000011A0 [email protected]
3 2 00001A40 [email protected]
4 3 000019A0 [email protected]
5 4 00001DC0 [email protected]
6 5 00001B30 [email protected]
7 6 00001BD0 [email protected]
8 7 00001C40 [email protected]
9 8 00001D60 [email protected]
10 9 00001B90 [email protected]
11 A 000011C0 [email protected]
12 B 00001210 [email protected]
13 C 00001AE0 [email protected]
14 D 00001220 [email protected]
15 E 00001180 [email protected]
16 F 000011F0 [email protected]
17 10 [email protected]
18 11 000011D0 [email protected]
19 12 00001D90 [email protected]
20 13 00001BA0 [email protected]
21 14 00001C00 [email protected]
22 15 00001D30 [email protected]
23 16 00001CE0 [email protected]
Summary
1000 .bss
1000 .data
1000 .edata
1000 .idata
1000 .rdata
1000 .reloc
2000 .text
你有-Djava.library.path虛擬機arg中的dll文件夾嗎? – 2012-07-10 19:07:02
dumpbin /導出Sixense_Java.dll報告是什麼? – Petesh 2012-07-10 19:41:55
這些DLL位於java.library.path的一個文件夾中,而@Petesh我剛剛添加了dumpbin的輸出。 – yodal 2012-07-10 21:14:44