【问题标题】:How to build a shared library without JNI in Android?如何在 Android 中构建没有 JNI 的共享库?
【发布时间】:2012-09-16 17:54:12
【问题描述】:

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

【问题讨论】:

  • 是的,可以这样做。您可以根据您的 Makefile 从 linux 创建 Android.mk 文件。准备好 Android make 文件后,您可以使用 android 工具链进行编译。我建议您查看 android 源代码,尤其是外部目录。这可以让你开始。

标签: android android-ndk java-native-interface arm eclipse-adt


【解决方案1】:

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

Android NDK 提供了丰富且易于使用的 ndk-build 命令,需要您准备至少一个 Android.mk 文件,供他们的 make 系统使用。在许多情况下,根据您的 makefile 准备此类文件是值得的。但是如果你从另一个平台移植的项目使用高级configureCmake功能,你可以完全跳过Android.mk,并使用作为NDK一部分的独立工具链,如NDK官方文档中的described .请注意,Android 不支持完整的 Linux glibc,而是支持称为 bionic 的子集。 STL支持也不是很明显,要choose one of the 7 options

您可以在这里停下来,获取共享库或可执行文件,然后以传统的 Linux 方式使用它们。你可以build your Android application all in C++

但最简单的方法是使用 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");
}

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

【讨论】:

    【解决方案2】:

    无需编写任何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编译库。

    【讨论】:

    • 您能否提供更多关于如何使用来自 android 应用程序的共享库方法调用来预构建本机库的信息。 Application.mk 文件应该放在哪里。
    猜你喜欢
    • 2014-03-22
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多