Интеграция c / c ++ с нативным кодом Java в качестве разделяемой библиотеки (скомпилировано gcj) - PullRequest
5 голосов
/ 14 февраля 2012

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

У кого-нибудь есть идея? Можно ли вызывать методы из нативного кода Java, скомпилированного gcj в программе на языке c / c ++?

1 Ответ

1 голос
/ 14 февраля 2012

вы можете использовать опции jni или cni в gcj для достижения вашей цели, и ваш код не является ни cni, ни jni code.

в любом случае против стандартной 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

надеюсь, это поможет?

...