2012-02-14 5 views
5

gcj может скомпилировать Java-код в собственный код. Мне интересно, если Java компилируется в общую библиотеку, как мы можем использовать методы из библиотеки в программах c/C++.Интеграция c/C++ с родным кодом Java в качестве общей библиотеки (скомпилирована gcj)

Мне не удалось. Ниже моя попытка:

Java код (будет составлен в общей библиотеке):

// JavaLib.java 
public class JavaLib { 
    public static void hello() { 
    System.out.println("Hello, in Java Lib"); 
    } 
} 

Compile:

$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); 
} 

Compile C++ библиотека пользователя:

$gcc -rdynamic -o CPPUser CPPUser.cpp -ldl 

Но я получил эту ошибку при выполнении 'CPPUser':

./libJavaLib.so: undefined symbol: JavaLib::hello 
Segmentation fault 

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

ответ

1

вы можете использовать JNI или CNI опцию в GCJ для acomplish вас цели, и ваш код не является ни CNI, ни JNI кода ..

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

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

+0

Значит ли это, даже если я скомпилировал Java в разделяемую библиотеку, мне все еще нужен JNI/CNI для вызова этих методов Java? – qinsoon

+1

Я читаю пример. Это не имеет значения. JNI/CNI используется для интерфейса C с Java. Я пытаюсь спросить, как связать обычный c/C++ с общей библиотекой (которая скомпилирована из Java вместо c/C++) – qinsoon

+0

да, для JNI наверняка .. потому что все работает внутри JVM ... –