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?
Android NDK 对使用它构建的二进制文件的 JNI 合规性没有要求。但通常Android应用程序是用Java编写的,当使用原生组件时,自然的路径是使用JNI。
Android NDK 提供了丰富且易于使用的 ndk-build 命令,该命令要求您至少准备一个Android.mk
供其 make 系统使用的文件。在许多情况下,根据您的 makefile 准备此类文件是值得的。但是,如果项目是从其他平台的端口采用先进configure
或Cmake
功能,你可以跳过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");
}
Run Code Online (Sandbox Code Playgroud)
您还应该确保 Android SDK构建器在创建APK文件时在libs/armeabi
或libs-armeabi-v7a
目录中找到文件。
可以在不编写任何JNI
特定 C 代码的情况下构建本机库。您需要创建Android.mk
并Application.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
编译库。