Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

JNI problem sa dve shared lib

[es] :: Java :: JNI problem sa dve shared lib

[ Pregleda: 1142 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

GORSHTAK
Ivan Matić

Član broj: 136182
Poruke: 285
*.adsl.eunet.rs.



+5 Profil

icon JNI problem sa dve shared lib28.04.2014. u 12:23 - pre 120 meseci
Zdravo svima,

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);
 


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();
}
/// .........
 


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();
   }
}

 


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?
 
Odgovor na temu

GORSHTAK
Ivan Matić

Član broj: 136182
Poruke: 285
*.adsl.eunet.rs.



+5 Profil

icon Re: JNI problem sa dve shared lib28.04.2014. u 14:24 - pre 120 meseci
Uspeo sam:
gcc -I"$JAVA/include" -I"$JAVA/include/linux" -I. -shared -o libmoja.so moja.c -m32 -pthread -ltudja -L.


Sledece sto me muci je kako da unsigned char* prekopiram u jbyteArray?
nasao sam da treba da koristim:
NewByteArray, GetArrayElements, ReleaseArrayElements
ali bez primera,

kodovi su sledeci:
Code:

// JAVA
private native int getData(byte[] data); // niz je uvek duzine 8

// C
JNIEXPORT jint JNICALL Java_CallTudje_getData  (JNIEnv *e , jobject j , jbyteArray d) {
   unsigned char data[8];
   jint ret = 0;
// .......
//  kako da prebacim dobijeni rezultat iz data u jbyteArray d ?
  return ret;
}
 
Odgovor na temu

[es] :: Java :: JNI problem sa dve shared lib

[ Pregleda: 1142 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.