5
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");
}
}
編譯:
$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
有沒有人有一個想法?是否可以在c/C++程序中調用由gcj編譯的Java本地代碼中的方法?
那麼這是否意味着,即使我將Java編譯到共享庫中,我仍然需要JNI/CNI來調用這些'Java'方法? – qinsoon 2012-02-14 05:49:03
我讀過這個例子。這似乎不相關。 JNI/CNI用於將C與Java接口。我想問的是如何將普通的c/C++與共享庫(它是從Java而不是c/C++編譯的)進行接口 – qinsoon 2012-02-14 05:56:50
是的,對於肯定的JNI ..因爲事情在JVM中運行...... – 2012-02-14 06:07:51