如何在Android中构建没有JNI的共享库?

Mr.*_*ool 5 java-native-interface android arm android-ndk eclipse-adt

我开发了一个Android应用程序,它需要是一个共享库。我已经在Linux(使用gcc)中制作了相同的库,所以我想在Android(ARM处理器)中编译相同的共享库。但是 NDK 只支持 JNI。现在我想构建一个没有直接 JNI 交互的单独共享库。我有很多 C 文件和头文件,所以我无法为所有内容编写 JNI。我想为 ARM 处理器构建我的库。我怎样才能做到这一点?

my stuture is
  ----->JNI
     ---->myfile.c(jni c code)
      ----->android.mk(here i call my two shared lib)

       folder1
             --->include
             ----src
             ---->lib(here i will get my shared lib)
       folder 2
            ----->include
            ----->src
            ----->lib(here i will get my 2nd shared lib)
Run Code Online (Sandbox Code Playgroud)

这里我想单独构建我的共享库,然后我会调用它。是否可以在 Android 中构建没有 JNI 的 shred lib?

Ale*_*ohn 6

Android NDK 对使用它构建的二进制文件的 JNI 合规性没有要求。但通常Android应用程序是用Java编写的,当使用原生组件时,自然的路径是使用JNI。

Android NDK 提供了丰富且易于使用的 ndk-build 命令,该命令要求您至少准备一个Android.mk供其 make 系统使用的文件。在许多情况下,根据您的 makefile 准备此类文件是值得的。但是,如果项目是从其他平台的端口采用先进configureCmake功能,你可以跳过Android.mk完全,并使用独立的工具链,这是NDK的一部分,描述NDK官方文档。请注意,Android 不支持完整的 Linux glibc,而是支持名为bionic的子集。STL支持也不明显,你必须选择7个选项之一

您可以在这里停下来,获取共享库或可执行文件,并以传统的 Linux 方式使用它们。您可以完全使用 C++ 构建您的 Android 应用程序

但最简单的方法是使用 Android SDK 构建 Java Android 应用程序,并通过 JDK 调用一些本地方法。您将需要一个包装器.so,一个将 JNI 函数导出到 Java 并依次调用非 JNI库的库。在Android.mk您可以使用LOCAL_SHARED_LIBRARIES. 您可能会发现以下问题对这部分很有用:ndk build library outside main project source tree

您需要在 Java 代码中“手动”加载本机库。系统加载程序仅在/system/lib文件夹中搜索未解析的引用。

常规的地方是使用本地方法的Java 类的静态构造函数。加载顺序很重要。如果libone.so依赖libtwo.so,并libjni.so依赖于libonelibtwo,你会碰到这样的

{
  System.Load("two");
  System.Load("one");
  System.Load("jni");
}
Run Code Online (Sandbox Code Playgroud)

您还应该确保 Android SDK构建器在创建APK文件时在libs/armeabilibs-armeabi-v7a目录中找到文件。


Ser*_* K. 5

可以在不编写任何JNI特定 C 代码的情况下构建本机库。您需要创建Android.mkApplication.mk为您的库文件。你有一个有效的makefile准备,所以你可以用它来制作一个Android.mk.

Application.mk 可以如下:

APP_OPTIM := release
APP_PLATFORM := android-7
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
APP_ABI := armeabi-v7a
APP_MODULES := <put-the-name-of-your-library-here>
Run Code Online (Sandbox Code Playgroud)

使用ndk-build编译库。