[英]Integrate c/c++ with Java native code as shared library (compiled by gcj)
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本機代碼中調用方法?
你可以使用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
希望能幫助到你 ?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.