5

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ネイティブコードからメソッドを呼び出すことは可能ですか?

4

1 に答える 1

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

それが役に立てば幸い ?

于 2012-02-14T05:39:33.300 に答える