如何在Android中构建没有JNI的共享库?

时间:2012-09-25 08:38:38

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

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

2 个答案:

答案 0 :(得分:4)

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

Android NDK提供了丰富且易于使用的ndk-build命令,该命令要求您准备至少一个由其make系统使用的Android.mk文件。在许多情况下,根据您的makefile准备此类文件是值得的。但是,如果您从其他平台移植的项目使用高级configureCmake功能,则可以完全跳过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.solibjni.so取决于libonelibtwo,则会有类似

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

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

答案 1 :(得分:3)

可以在不编写任何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编译库。

相关问题