【问题标题】:Integrate c/c++ with Java native code as shared library (compiled by gcj)将 c/c++ 与 Java 原生代码集成为共享库(由 gcj 编译)
【发布时间】:2012-02-14 05:18:30
【问题描述】:

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 本机代码中的方法?

【问题讨论】:

    标签: java c shared-libraries gcj


    【解决方案1】:

    您可以使用 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 编译成共享库,我仍然需要 JNI/CNI 来调用那些“Java”方法?
    • 我阅读了这个例子。似乎不相关。 JNI/CNI 用于将 C 与 Java 连接起来。我想问的是如何将普通的 c/c++ 与共享库(它是从 Java 而不是 c/c++ 编译的)接口
    • 对于 CNI,它们也需要初始化 VM,因此是的,您需要 d JNI/CNI 来调用那些“Java”方法...
    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多