如何在普通的非Android Java应用程序中使用NDK编译的JNI库?

Ann*_*ova 4 java java-native-interface android android-ndk

我有一个JNI库,由Android应用程序和NDK一起使用.我没有源代码,只为某些arch编译了.so文件.

我想在64位x86 linux PC上的简单控制台Java应用程序中调用此库中的函数.

我做了什么:

  1. 我从x86_64文件夹中取出了库,并使用它将其加载到我的Java程序中 System.loadLibrary
  2. 试图启动该程序并获得UnsatisfiedLinkError详细信息liblog.so: cannot open shared object file: No such file or directory.
  3. 所以我从官方NDK中获取了x86_64 arch的liblog.so并加载了它,然后得到了同样的错误 libstdc++.so: cannot open shared object file: No such file or directory
  4. 为libstdc ++做了同样的事情.所以库得到了这个/usr/lib/x86_64-linux-gnu/libc.so: invalid ELF header.
  5. 打开libc.so,它似乎只是一个文本文件...用适当的libc.so文件替换它
  6. 最后通过undefined symbol: __stack_chk_guard评论获得了我的库的UnsatisfiedLinkError .看起来我的图书馆强烈收紧了Android的东西

如果没有特定于Android的程序,我该怎么做才能在普通程序中使用这个库?

Ser*_*gio 6

简而言之 - Android和桌面Linux二进制文件是不兼容的,即使它们针对的是相同的CPU架构.

  • @AndreyStartsev 有时它可能会起作用(如果没有特定于 android 的依赖项并且您可以以某种方式加载 ELF 文件)。但在运行时肯定会有惊喜。即使您已经从 android 中获取了所有用户模式模块 - 内核也有点不同且不兼容。当然,您可以在桌面 linux 上使用 android 二进制文件,但甚至不要考虑在生产中使用这种方法。 (2认同)