2012-02-14 9 views
5

gcj può compilare codice Java in codice nativo. Mi interessa se Java è compilato nella libreria condivisa, come possiamo usare i metodi dalla libreria nei programmi c/C++.Integrare c/C++ con codice nativo Java come libreria condivisa (compilato da gcj)

Non ci sono riuscito. Quello che segue è il mio tentativo:

codice Java (saranno raccolte in libreria condivisa):

// JavaLib.java 
public class JavaLib { 
    public static void hello() { 
    System.out.println("Hello, in Java Lib"); 
    } 
} 

Compile:

$gcj -C JavaLib.java 
$gcj -fPIC -c JavaLib.class 
$gcj -shared -o libJavaLib.so JavaLib.o -lstdc++ 

Genera intestazione:

$gcjh -cp=. JavaLib 

utente Biblioteca C++:

#include <stdio.h> 
#include <dlfcn.h> 
#include "JavaLib.h" 
using namespace std; 
int main(int argc, char **argv) { 
    void * handle = dlopen("./libJavaLib.so", RTLD_LAZY); 
    char * error; 

    if (!handle) { 
    fprintf(stderr, "%s\n", dlerror()); 
    } 

    void (*hello)(); 
    hello = (void (*)())dlsym(handle, "JavaLib::hello"); 

    if ((error = dlerror()) != NULL) { 
    fprintf(stderr, "%s\n", error); 
    } 

    hello(); 
    dlclose(handle); 
} 

Compile C++ User Library:

$gcc -rdynamic -o CPPUser CPPUser.cpp -ldl 

Ma ho ottenuto questo errore durante l'esecuzione di 'CPPUser':

./libJavaLib.so: undefined symbol: JavaLib::hello 
Segmentation fault 

Qualcuno ha un'idea? È possibile invocare metodi dal codice nativo Java compilato da gcj in un programma c/C++?

risposta

1

è possibile utilizzare il JNI o ​​opzioni CNI in gcj per compire voi obiettivo, e il codice non è né CNI, nè il codice JNI ..

in ogni modo contro Java Standard VM, gcj promosso CNI ... eppure bisogna aggiungere , JNI significa che è possibile prendere il codice per

esempio vari di VM per jni:

http://gcc.gnu.org/java/jni-comp.txt

CNI è spiegato qui: https://idlebox.net/2011/apidocs/gcc-4.6.0.zip/gcj-4.6.0/gcj_13.html

spero che aiuti?

+0

Questo significa, anche se ho compilato Java nella libreria condivisa, ho ancora bisogno di JNI/CNI per richiamare quei metodi "Java"? – qinsoon

+1

Ho letto l'esempio. Sembra non pertinente. JNI/CNI è usato per interfacciare C con Java. Quello che sto cercando di chiedere è come interfacciare il normale c/C++ con la libreria condivisa (che è compilata da Java invece di c/C++) – qinsoon

+0

sì, per JNI di sicuro .. perché le cose girano all'interno di una JVM ... –

Problemi correlati