Hi,
ich habe (leider) wieder ein Problem bezüglich JNI. Ich möchte ein größeres C++-Programm (Bullet Physics Engine, ja, es gibt JBullet, ich bräuchte aber die aktuellste, vollständige Version) über JNI ausführen. Deshalb habe ich es als *.so kompiliert und eine weitere C-Klasse geschrieben, die die Engine verwendet (in diesem Fall ein Hello-World-Programm ausführt). Diese zweite *.so-Datei möchte ich nun über JNI aufrufen.
Zurzeit erhalte ich allerdings eine Fehlermeldung. (siehe unten)
Zuvor hatte ich das Problem, dass ich für gcc erst noch den Ort für die Header, zusätzlich zu den *.so-Dateien angeben musste (-I/home/pfad/bullet-2.80-rev2531/src). Muss ich für JNI ebenfalls zusätzliche Parameter für die Header angeben?
Eigentlich dürfte sich, im Gegensatz zu meinen vorigen Versuchen mit JNI, ja nicht viel verändert haben. Im Quellcode verweise ich jetzt nur zusätzlich auf einen Header, die Compilierung der C++-Klasse funktioniert durch die zusätzliche Pfadangabe aber reibungslos.
Warum erhalte ich dann später beim Ausführen durch Java eine Fehlermeldung?
Diesmal sollten auch die Bezeichnungen der *.so-Dateien stimmen.
C++-Klasse
Compile-Script:
Fehlermeldung:
ich habe (leider) wieder ein Problem bezüglich JNI. Ich möchte ein größeres C++-Programm (Bullet Physics Engine, ja, es gibt JBullet, ich bräuchte aber die aktuellste, vollständige Version) über JNI ausführen. Deshalb habe ich es als *.so kompiliert und eine weitere C-Klasse geschrieben, die die Engine verwendet (in diesem Fall ein Hello-World-Programm ausführt). Diese zweite *.so-Datei möchte ich nun über JNI aufrufen.
Zurzeit erhalte ich allerdings eine Fehlermeldung. (siehe unten)
Zuvor hatte ich das Problem, dass ich für gcc erst noch den Ort für die Header, zusätzlich zu den *.so-Dateien angeben musste (-I/home/pfad/bullet-2.80-rev2531/src). Muss ich für JNI ebenfalls zusätzliche Parameter für die Header angeben?
Eigentlich dürfte sich, im Gegensatz zu meinen vorigen Versuchen mit JNI, ja nicht viel verändert haben. Im Quellcode verweise ich jetzt nur zusätzlich auf einen Header, die Compilierung der C++-Klasse funktioniert durch die zusätzliche Pfadangabe aber reibungslos.
Warum erhalte ich dann später beim Ausführen durch Java eine Fehlermeldung?
Diesmal sollten auch die Bezeichnungen der *.so-Dateien stimmen.
C++-Klasse
Code:
#include <jni.h>
#include <iostream>
#include <btBulletDynamicsCommon.h>
JNIEXPORT void JNICALL Java_jni_callnative(JNIEnv *env,
jobject obj)
{
return ;
}
Compile-Script:
Code:
javac jni.java
javah -jni jni
gcc -fPIC -shared -I/home/pfad/bullet-2.80-rev2531/src -I/usr/local/java/include -I/usr/local/java/include/genunix hello.cpp -o libhello.so -LBulletCollision -LBulletDynamics -LBulletMultiThreaded -LBulletSoftBody -LLinearMath -LMiniCL
export LD_LIBRARY_PATH="/home/pfad/JNIBulletHello"
java jni
Fehlermeldung:
Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/pfad/JNIBulletHello/libhello.so: /home/pfad/JNIBulletHello/libhello.so: undefined symbol: __cxa_pure_virtual
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at jni.<clinit>(jni.java:9)