2012-02-14 61 views
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本地代碼中的方法?

回答

1

你可以使用JNI或GCJ CNI選項acomplish你的目標,你的代碼既不是CNI,也不JNI代碼..

反正對標準的Java虛擬機,GCJ促進CNI ...但必須添加,JNI意味着你可以把你的代碼,以各種虛擬機的

例如對於JNI:

http://gcc.gnu.org/java/jni-comp.txt

CNI在此說明:https://idlebox.net/2011/apidocs/gcc-4.6.0.zip/gcj-4.6.0/gcj_13.html

希望它有幫助嗎?

+0

那麼這是否意味着,即使我將Java編譯到共享庫中,我仍然需要JNI/CNI來調用這些'Java'方法? – qinsoon 2012-02-14 05:49:03

+1

我讀過這個例子。這似乎不相關。 JNI/CNI用於將C與Java接口。我想問的是如何將普通的c/C++與共享庫(它是從Java而不是c/C++編譯的)進行接口 – qinsoon 2012-02-14 05:56:50

+0

是的,對於肯定的JNI ..因爲事情在JVM中運行...... – 2012-02-14 06:07:51