将c / c ++与Java本机代码集成为共享库(由gcj编译)

时间:2012-02-14 05:18:30

标签: java c shared-libraries gcj

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

1 个答案:

答案 0 :(得分: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

希望有帮助吗?