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

时间:2016-09-21 22:56:11

标签: java android android-ndk java-native-interface

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

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

我做了什么:

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

1 个答案:

答案 0 :(得分:5)

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