gpt4 book ai didi

java - 将c/c++与Java原生代码集成为共享库(gcj编译)

转载 作者:搜寻专家 更新时间:2023-11-01 00:52:18 24 4
gpt4 key购买 nike

gcj可以将Java代码编译成本地代码。我感兴趣的是,如果 Java 被编译成共享库,我们如何在 c/c++ 程序中使用库中的方法。

我没有成功。以下是我的尝试:

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 native 代码中调用方法?

最佳答案

您可以使用 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

希望对您有所帮助?

关于java - 将c/c++与Java原生代码集成为共享库(gcj编译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com