2012-02-14 14 views
5

gcj puede compilar código Java en código nativo. Me interesa si Java se compila en una biblioteca compartida, cómo podemos usar métodos de la biblioteca en programas c/C++.Integrar c/C++ con código nativo de Java como biblioteca compartida (compilada por gcj)

No tuve éxito. La siguiente es mi intento:

código Java (será compilado en la biblioteca compartida):

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

Compilar:

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

Generar cabecera:

$gcjh -cp=. JavaLib 

usuario Biblioteca de 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); 
} 

compilar C++ usuario de la biblioteca:

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

Pero tengo este error al ejecutar 'CPPUser':

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

¿Alguien tiene una idea? ¿Es posible invocar métodos del código nativo de Java compilado por gcj en un programa c/C++?

Respuesta

1

puede utilizar la JNI o ​​las opciones de la CNI en gcj a acomplish se meta, y su código es ni CNI, ni código JNI ..

de todos modos en contra de Java VM estándar, gcj promovido CNI ... sin embargo, hay que añadir , JNI significa que puede tomar su código de ejemplo

varios de VM para JNI:

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

CNI se explica aquí: https://idlebox.net/2011/apidocs/gcc-4.6.0.zip/gcj-4.6.0/gcj_13.html

Espero que ayude?

+0

¿Significa esto que, incluso si compilé Java en la biblioteca compartida, todavía necesito JNI/CNI para invocar esos métodos 'Java'? – qinsoon

+1

Leí el ejemplo. Parece no relevante. JNI/CNI se usa para la interfaz C con Java. Lo que estoy tratando de preguntar es cómo hacer una interfaz normal c/C++ con una biblioteca compartida (compilada desde Java en lugar de c/C++) – qinsoon

+0

sí, para JNI seguro ... porque las cosas se ejecutan dentro de una JVM ... –

Cuestiones relacionadas