[英]How to build a shared library without JNI in Android?
我开发了一个Android应用程序,它需要是一个共享库。 我已经在Linux中使用了相同的lib(使用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库吗?
Android NDK对使用它构建的二进制文件的JNI合规性没有要求。 但通常Android应用程序是用Java编写的,当它们使用本机组件时,自然路径就是使用JNI。
Android NDK提供了丰富且易于使用的ndk-build命令,它要求您准备至少一个make系统使用的Android.mk
文件。 在许多情况下,根据您的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构建库 。
您需要在Java代码中“手动”加载本机库。 系统加载程序仅搜索/system/lib
文件夹中的未解析引用。
传统的地方是使用本机方法的Java类的静态构造函数。 装载顺序很重要。 如果libone.so
依赖于libtwo.so
,而libjni.so
依赖于libone
和libtwo
,你会有类似的东西
{
System.Load("two");
System.Load("one");
System.Load("jni");
}
您还应确保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>
使用ndk-build
编译库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.