gcj может скомпилировать Java-код в собственный код. Мне интересно, если Java компилируется в общую библиотеку, как мы можем использовать методы из библиотеки в программах c/C++.Интеграция c/C++ с родным кодом Java в качестве общей библиотеки (скомпилирована gcj)
Мне не удалось. Ниже моя попытка:
Java код (будет составлен в общей библиотеке):
// 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++
Генерация заголовка:
$gcjh -cp=. JavaLib
Библиотека пользователя в 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++ библиотека пользователя:
$gcc -rdynamic -o CPPUser CPPUser.cpp -ldl
Но я получил эту ошибку при выполнении 'CPPUser':
./libJavaLib.so: undefined symbol: JavaLib::hello
Segmentation fault
Кто-нибудь есть идеи? Можно ли вызывать методы из собственного кода Java, скомпилированного gcj в программе c/C++?
Значит ли это, даже если я скомпилировал Java в разделяемую библиотеку, мне все еще нужен JNI/CNI для вызова этих методов Java? – qinsoon
Я читаю пример. Это не имеет значения. JNI/CNI используется для интерфейса C с Java. Я пытаюсь спросить, как связать обычный c/C++ с общей библиотекой (которая скомпилирована из Java вместо c/C++) – qinsoon
да, для JNI наверняка .. потому что все работает внутри JVM ... –