Ik zou graag eens iets doen met JNI, gewoon als test om te zien wat je er allemaal mee kan doen. Educatief prutsen zeg maar
Ik ben nu al enkele uren bezig aan het proberen iets werkend te krijgen, maar loop met m'n hoofd keihard tegen de (spreekwoordelijke) muur
Wat ik ook probeer, ik blijf de volgende exceptie krijgen:
Om eens een voorbeeldje te geven, een basic java class met één simpele method:
Ik compile m'n class (jdk 1.6.0_21) en run dan javah zonder problemen om m'n header file te genereren:
Met de volgende file als resultaat, so far so good ... :
Mijn tijdelijke implementatie ziet er zo uit:
Dat compiled perfect naar een dll (jnitest.dll), maar als ik nu de method call zoals in m'n java class staat krijg ik bovenstaande exceptie. De dll staat zeker in z'n classpath, dat is het probleem niet. Mocht dit niet zo zijn zou ik een andere exceptie krijgen (java.lang.UnsatisfiedLinkError: no jnitest in java.library.path).
Na heel wat googlen ben ik op deze site uitgekomen waar iemand dezelfde exceptie krijgt als ik.
Aangezien ik zo goed als geen ervaring heb met C, vermoedde ik eerst dat m'n dll niet in orde was (method niet geëxporteerd?) Dus heb ik via een tooltje (DLL Export Viewer) m'n method bekeken. Volgens mij ziet dat er goed uit ...

Ik heb ook geen rare of unresolved dependencies:

Momenteel heb ik geen idee meer. Iemand meer ervaring met JNI die me op weg kan helpen? Dit is de dll die ik uit bovenstaande code gegenereerd heb.
Wat ik ook probeer, ik blijf de volgende exceptie krijgen:
Exception in thread "main" java.lang.UnsatisfiedLinkError: info.fluxprojects.JniTest.testMethod()V at info.fluxprojects.JniTest.testMethod(Native Method) at info.fluxprojects.JniTest.main(JniTest.java:19) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Om eens een voorbeeldje te geven, een basic java class met één simpele method:
Java: JniTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| package info.fluxprojects; public class JniTest { public native void testMethod(); static { System.loadLibrary("jnitest"); } public static void main(String[] args) { new JniTest().testMethod(); } } |
Ik compile m'n class (jdk 1.6.0_21) en run dan javah zonder problemen om m'n header file te genereren:
javah -jni -o JniTest.h info.fluxprojects.JniTest
Met de volgende file als resultaat, so far so good ... :
C: JniTest.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class info_fluxprojects_JniTest */ #ifndef _Included_info_fluxprojects_JniTest #define _Included_info_fluxprojects_JniTest #ifdef __cplusplus extern "C" { #endif /* * Class: info_fluxprojects_JniTest * Method: testMethod * Signature: ()V */ JNIEXPORT void JNICALL Java_info_fluxprojects_JniTest_testMethod (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif |
Mijn tijdelijke implementatie ziet er zo uit:
C: JniTest.c
1
2
3
4
5
| #include "JniTest.h" JNIEXPORT void JNICALL Java_info_fluxprojects_JniTest_testMethod(JNIEnv * e, jobject o){ return; } |
Dat compiled perfect naar een dll (jnitest.dll), maar als ik nu de method call zoals in m'n java class staat krijg ik bovenstaande exceptie. De dll staat zeker in z'n classpath, dat is het probleem niet. Mocht dit niet zo zijn zou ik een andere exceptie krijgen (java.lang.UnsatisfiedLinkError: no jnitest in java.library.path).
Na heel wat googlen ben ik op deze site uitgekomen waar iemand dezelfde exceptie krijgt als ik.
Aangezien ik zo goed als geen ervaring heb met C, vermoedde ik eerst dat m'n dll niet in orde was (method niet geëxporteerd?) Dus heb ik via een tooltje (DLL Export Viewer) m'n method bekeken. Volgens mij ziet dat er goed uit ...

Ik heb ook geen rare of unresolved dependencies:

Momenteel heb ik geen idee meer. Iemand meer ervaring met JNI die me op weg kan helpen? Dit is de dll die ik uit bovenstaande code gegenereerd heb.