gcjは、Javaコードをネイティブコードにコンパイルできます。Javaが共有ライブラリにコンパイルされているかどうか、c /c++プログラムでライブラリのメソッドをどのように使用できるかに興味があります。
私は成功しませんでした。以下は私の試みです:
Javaコード(共有ライブラリにコンパイルされます):
// JavaLib.java
public class JavaLib {
public static void hello() {
System.out.println("Hello, in Java Lib");
}
}
コンパイル:
$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);
}
c ++ライブラリユーザーをコンパイルします:
$gcc -rdynamic -o CPPUser CPPUser.cpp -ldl
しかし、「CPPUser」を実行すると、次のエラーが発生しました。
./libJavaLib.so: undefined symbol: JavaLib::hello
Segmentation fault
誰かアイデアがありますか?ac / c ++プログラムでgcjによってコンパイルされたJavaネイティブコードからメソッドを呼び出すことは可能ですか?