簡體   English   中英

將c / c ++與Java本機代碼集成為共享庫(由gcj編譯)

[英]Integrate c/c++ with Java native code as shared library (compiled by 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

有沒有人有想法? 是否可以從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

希望能幫助到你 ?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM