我开发了一个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库吗?
答案 0 :(得分:4)
Android NDK对使用它构建的二进制文件的JNI合规性没有要求。但通常Android应用程序是用Java编写的,当它们使用本机组件时,自然路径就是使用JNI。
Android NDK提供了丰富且易于使用的ndk-build命令,该命令要求您准备至少一个由其make系统使用的Android.mk
文件。在许多情况下,根据您的makefile准备此类文件是值得的。但是,如果您从其他平台移植的项目使用高级configure
或Cmake
功能,则可以完全跳过Android.mk
,并使用作为NDK一部分的独立工具链,{ {3}}在NDK官方文档中。请注意,Android不支持完整的Linux glibc ,而是支持名为 bionic 的子集。 STL支持也不明显,你必须described!
您可以在这里停下来,获取共享库或可执行文件,并以传统的Linux方式使用它们。你可以choose one of the 7 options。
但最简单的方法是使用Android SDK构建Java Android应用程序,并通过JDK调用一些本机方法。您需要一个包装器.so
,一个将JNI函数导出到Java并依次调用非JNI 库的库。在Android.mk
中,您可以使用LOCAL_SHARED_LIBRARIES
来引用这些库。您可能会发现以下问题对此部分有用:build your Android application all in C++。
您需要在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
目录中的文件。
答案 1 :(得分:3)
可以在不编写任何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
编译库。