5

我开发了一个 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)

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

4

2 回答 2

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依赖于libone和依赖libtwo,你将有类似的东西

{
  System.Load("two");
  System.Load("one");
  System.Load("jni");
}

您还应该确保 Android SDK构建器在创建APKlibs/armeabi文件时可以在其中或目录中找到文件。libs-armeabi-v7a

于 2012-09-25T13:11:33.300 回答
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>

用于ndk-build编译库。

于 2012-09-25T10:39:05.960 回答