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++?
Questo significa, anche se ho compilato Java nella libreria condivisa, ho ancora bisogno di JNI/CNI per richiamare quei metodi "Java"? – qinsoon
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
sì, per JNI di sicuro .. perché le cose girano all'interno di una JVM ... –