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 원시 코드에서 메소드를 호출 할 수 있습니까?
그렇다면 Java를 공유 라이브러리로 컴파일하더라도 Java '메소드를 호출하기 위해 JNI/CNI가 필요합니다. – qinsoon
예제를 읽었습니다. 그것은 적합하지 않은 것 같습니다. JNI/CNI는 C와 Java를 인터페이스하는 데 사용됩니다. 내가 물어 보려고하는 것은 공용 라이브러리 (C/C++ 대신 Java에서 컴파일 된)와 일반 C/C++ 인터페이스 방법입니다. – qinsoon
예, JNI 용입니다. JVM 내부에서 실행되기 때문에 ... –