qin*_*oon 5 c java gcj shared-libraries
gcj可以将Java代码编译为本机代码.我感兴趣的是如果将Java编译成共享库,我们如何在c/c ++程序中使用库中的方法.
我没有成功.以下是我的尝试:
Java代码(将编译成共享库):
// JavaLib.java
public class JavaLib {
public static void hello() {
System.out.println("Hello, in Java Lib");
}
}
Run Code Online (Sandbox Code Playgroud)
编译:
$gcj -C JavaLib.java
$gcj -fPIC -c JavaLib.class
$gcj -shared -o libJavaLib.so JavaLib.o -lstdc++
Run Code Online (Sandbox Code Playgroud)
生成标题:
$gcjh -cp=. JavaLib
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
编译c ++库用户:
$gcc -rdynamic -o CPPUser CPPUser.cpp -ldl
Run Code Online (Sandbox Code Playgroud)
但是在执行'CPPUser'时遇到了这个错误:
./libJavaLib.so: undefined symbol: JavaLib::hello
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
有没有人有想法?是否可以从ac/c ++程序中的gcj编译的Java本机代码中调用方法?
您可以使用 gcj 中的 jni 或 cni 选项来完成您的目标,并且您的代码既不是 cni 也不是 jni 代码。
无论如何,针对标准 java VM,gcj 提升了 cni...但必须添加,jni 意味着您可以将代码带到各种 VM
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
希望能帮助到你 ?