【问题标题】:How to load a native shared object, in a jar, from an android application?如何从 android 应用程序加载 jar 中的本机共享对象?
【发布时间】:2024-01-21 21:57:01
【问题描述】:

我有一个共享对象,我称之为“libFoo.so”,它是针对 NDK 编译的。我有一个使用该共享对象的 java 项目(我将其称为“jarlib”),通过调用

System.loadLibrary("Foo");

那个 java 项目,我导出为 jar,并在 android 应用程序中使用。如果我注释掉关于共享对象的所有内容,jar 就可以正常工作,并且我可以完美地与之交互。

我可以使用 jarlib,以及来自 Unity android 应用程序的共享对象以及 ./lib/armeabi/libFoo.so 中的共享对象,它会将其全部加载。

我正在尝试在我的非统一 android 应用程序中使用 jarlib 和 libFoo.so,而 loadLibrary 绝对拒绝找到 libFoo.so。我已经尝试将其放置在我的 ./lib 以及 ./lib/armeabi 中的 apk 中,但似乎没有任何东西可以让 load 调用看到它。

我尝试将 libFoo.so 包含在 jarlib 的 ./lib 或 ./lib/armeabi 中,但是一旦我尝试构建/运行我的 android 应用程序,就会被告知:

The library 'jarlib.jar' contains native libraries that will not run on the device.
The following libraries were found:
  - libFoo.so

如果它在 ./lib(不是 ./lib/armeabi)中,则使用这个

Additionally some of those libraries will interfer with the installation of the application because of their location in lib/
lib/ is reserved for NDK libraries.

我不确定我缺少什么组合,但我确信它可以做到,我似乎无法弄清楚如何做到这一点!

【问题讨论】:

    标签: android shared-libraries


    【解决方案1】:

    好吧!原来它是如此微小,以至于让我头痛了八个小时。

    我发现我的 libFoo.so 没有像统一构建 apk 时那样出现在我的 app.apk/lib/armeabi/libFoo.so 中。我认为这与此有关,所以我开始寻找设置以确保将我的 lib 文件夹复制到 apk。

    事实证明,lib 文件夹不是,但是...

    记住我说过我在(在 android 应用程序端)尝试过它:

    ./lib/libFoo.so
    -and-
    ./lib/armeabi/libFoo.so
    

    事实证明,我需要做的是把它放在类似的路径上。哦,太像了。

    ./libs/armeabi/libFoo.so
    

    是的。库。带有 s

    事实上,当我将文件夹“lib”重命名为“libs”时,它更改了 eclipse 中文件夹的图标,使其上有一个小的 android 符号,就像 bin 或 res 文件夹一样。果然,当你构建 apk 时,lib/armeabi 文件夹就在那里(注意它在 apk 中被命名为“lib”,而不是“libs”。这仍然让我感到困惑。)

    我的一位同事(在我之前从事这个项目的工作)告诉我,在某个地方,该文件夹曾经是“lib”,但后来在更高版本的安卓SDK。无论哪种方式,刚拿起这个项目,我都没有意识到该文件夹​​应该被命名为“lib”,因为它对我来说似乎很好。我正准备把头发拉出来。我把这个留在这里,希望有人遇到我遇到的同样问题,并设法更快地解决它。

    【讨论】:

      最近更新 更多