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