J'essaie de créer un wrapper Java pour une DLL tierce. J'ai créé ma propre DLL qui agit comme un intermédiaire entre JNI et la DLL tierce. En java je charge bien cette DLL mais l'erreur java.lang.UnsatisfiedLinkError: sixense.Sixense.init()Z
est renvoyée. Quelle pourrait être la cause de cette erreur et comment puis-je la déboguer correctement?java.lang.UnsatisfiedLinkError retourné lors de l'appel de la méthode native
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");
}
}
Un extrait de 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;
}
Un extrait de 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);
sortie de 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
Avez-vous le dossier avec les dll dans votre -Djava.library.path VM arg? –
Que génère le rapport dumpbin/exports Sixense_Java.dll? – Petesh
Les DLL sont dans un dossier qui fait partie de java.library.path et @Petesh Je viens d'ajouter la sortie de dumpbin. – yodal