Imam 2 shared biblioteke: libmoja.so, koju ja pisem i libtudja.so, za koji nemam izvorni kod.
libtudja.so treba da iskoristim u javi, pa zbog toga pisem "proxy" biblioteku libmoja.so
libtudja.so sadrzi sledece funkcije:
Code (c):
int openConnection();
int closeConnection();
int requestData();
int getData(unsigned char* data, int* dataLen);
int openConnection();
int closeConnection();
int requestData();
int getData(unsigned char* data, int* dataLen);
kod za libmoja.so bi izgledala ovako:
Code (c):
#include "tudja.h"
JNIEXPORT jint JNICALL Java_CallTudja_openConn
(JNIEnv *e, jobject j) {
return openConnection();
}
JNIEXPORT jint JNICALL Java_CallTudja_closeConn
(JNIEnv *e, jobject j) {
return closeConnection();
}
/// .........
#include "tudja.h"
JNIEXPORT jint JNICALL Java_CallTudja_openConn
(JNIEnv *e, jobject j) {
return openConnection();
}
JNIEXPORT jint JNICALL Java_CallTudja_closeConn
(JNIEnv *e, jobject j) {
return closeConnection();
}
/// .........
ako bih libtudja.so koristio u c projektu, kompajlirao bih ovako:
gcc -Wall -L. -ltudja -pthread -m32 -o gl glavni.c
java kod mi izgleda ovako:
Code (java):
public class CallTudja {
static {
System.loadLibrary("tudja"); // nisam siguran da li mi treba ovde
System.loadLibrary("moja");
}
private native int openConn();
private native int closeConn();
// .....
public static void main(String[] args) {
CallTudja hj = new CallTudja();
int com = hj.openConn();
// .......
hj.closeConn();
}
}
public class CallTudja {
static {
System.loadLibrary("tudja"); // nisam siguran da li mi treba ovde
System.loadLibrary("moja");
}
private native int openConn();
private native int closeConn();
// .....
public static void main(String[] args) {
CallTudja hj = new CallTudja();
int com = hj.openConn();
// .......
hj.closeConn();
}
}
java projekat sam kompajlirao i izvrsio ovako:
javac CallTudja.java
javah -jni CallTudja
gcc -I"$JAVA/include" -I"$JAVA/include/linux" -I. -shared -o libmoja.so moja.c -m32 -pthread
$JAVA/bin/java -Djava.library.path=. CallTudja
a rezultat je ovaj:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /mnt/data2/projekti/rucno/java/libmoja.so: /mnt/data2/projekti/rucno/java/libmoja.so: undefined symbol: openConnection
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1880)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at CallTudja.<clinit>(CallTudja.java:3)
napomena: libtudja.so je uradjena za 32bitni OS i koristi thread, java koju koristim je takodje 32bitna
jel ima neko ideju kako da ovo resim?