2012-02-14 1 views
5

gcj는 Java 코드를 원시 코드로 컴파일 할 수 있습니다. Java가 공유 라이브러리로 컴파일 된 경우, c/C++ 프로그램에서 라이브러리의 메소드를 사용하는 방법에 관심이 있습니다.공유 라이브러리로 Java 원시 코드와 c/C++ 통합 (gcj로 컴파일 됨)

나는 성공하지 못했습니다. 다음은 내 시도 :

자바 코드 (공유 라이브러리로 컴파일됩니다) :

// 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

당신이 목표를 acomplish하기 위해 JNI 또는 GCJ에서 CNI 옵션을 사용할 수 있으며, 코드가도 CNI,도 JNI 코드입니다 .. 어쨌든 표준 자바 VM에 대한

, GCJ는 ... CNI 승진 아직 추가해야합니다

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

, JNI는 JNI에 대한 다양한 VM의

예제 코드를 취할 수 있음을 의미 0

도움이 되셨습니까?

+0

그렇다면 Java를 공유 라이브러리로 컴파일하더라도 Java '메소드를 호출하기 위해 JNI/CNI가 필요합니다. – qinsoon

+1

예제를 읽었습니다. 그것은 적합하지 않은 것 같습니다. JNI/CNI는 C와 Java를 인터페이스하는 데 사용됩니다. 내가 물어 보려고하는 것은 공용 라이브러리 (C/C++ 대신 Java에서 컴파일 된)와 일반 C/C++ 인터페이스 방법입니다. – qinsoon

+0

예, JNI 용입니다. JVM 내부에서 실행되기 때문에 ... –

관련 문제