2017-06-09 94 views
1

我有file.c,我想将其包含到我的Java应用程序中。 我创建了JNI模块,并将其与nar-maven-plugin一起应用于应用程序。使用nar-maven-plugin将外部.so库添加到jni项目

下面是它的配置:

<plugin> 
    <groupId>com.github.maven-nar</groupId> 
    <artifactId>nar-maven-plugin</artifactId> 
    <version>3.5.2</version> 
    <extensions>true</extensions> 
    <configuration> 
     <libraries> 
      <library> 
       <type>jni</type> 
       <narSystemPackage>my.package.nativelib</narSystemPackage> 
      </library> 
     </libraries> 
    </configuration> 
</plugin> 

我跑mvn clean install后,它创建libmy-native-lib.so文件。

我设法从Java达到C-功能,但有一个问题:file.c使用外部libexternal.so库(包含在file.c#include "external.h"),并且当它从external.h到达任意功能失败与“符号查找错误” 。

我尝试使用

static { 
    System.load("/usr/lib/libexternal.so"); 
} 

static { 
    System.loadLibrary("external"); 
} 

,但似乎没有奏效。

那么如何将外部* .so库添加到JNI项目?

回答

0

看看这里,看看如何处理JNI和共享库:

http://jnicookbook.owsiak.org/recipe-No-023/

你需要做的是你的共享库(JNI)与一个所使用JNI代码链接。然后,你可以为你的代码提供这个库,或者你可以要求用户在系统中安装它(例如通过包)。

与JNI玩得开心

+0

据我所知,在这里没有* .so库,你有另一个* .c文件。这不是很不一样吗? – htshame

+0

这个另一个文件“c/recipeNo023_AnotherFunction.c”被编译为共享库。然后,“c/recipeNo023_HelloWorld.c”链接到这个共享库。你可以看看这里发生了什么:https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo023 – mko

+0

是的,对不起,我的坏。我是C中的一个noob。当我尝试运行第二个命令时,我得到cc:error:无法识别的命令行选项'-install_name' – htshame