在java中使用非jni本机库

时间:2016-03-19 08:42:27

标签: java java-native-interface shared

我有一个没有jni标题创建的* .so库,我没有这个库的来源。我必须能够在我的java项目中使用这个库。任何想法如何实现?

可能是可以从非jni库创建jni库吗?

有一个人说这是可能的,但他没有解释如何让它发挥作用:https://community.oracle.com/thread/1552150?start=0&tstart=0

1 个答案:

答案 0 :(得分:2)

您可以编写自己的JNI包装器共享库。通常,您的Java代码将System.loadLibrary()您的包装器,动态链接器将解析对原始非jni 库和 dlopen()的引用它。这意味着您必须确保将两个*.so文件与Java应用程序打包在一起,第二个( non-jni )位于动态链接器的搜索路径上。在某些情况下,首先为非jni System.loadLibrary()调用System.load()*.so更容易,然后再为包装器调用。

要编写包装器,您需要 non-jni 库的标头。如果您没有完整的标题,请不要绝望:您只需要知道如何调用此库的特定公共函数,以满足您的特定任务。没有必要单独包装每个功能。例如。如果3 rd 方本机库公开C API以获取长度并填充数组,则JNI可以公开设置Java数组的方法。

您的包装器将负责将Java数据类型(包括类)转换为3 rd 方库的数据类型。