2012-02-14 80 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