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++?
¿Significa esto que, incluso si compilé Java en la biblioteca compartida, todavía necesito JNI/CNI para invocar esos métodos 'Java'? – qinsoon
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
sí, para JNI seguro ... porque las cosas se ejecutan dentro de una JVM ... –