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

如何在Android中构建没有JNI的共享库?,android,android-ndk,java-native-interface,arm,eclipse-adt,Android,Android Ndk,Java Native Interface,Arm,Eclipse Adt,我开发了一个Android应用程序,它需要一个共享库。我已经在Linux中创建了相同的库(使用gcc),所以我想在Android(ARM处理器)中编译相同的共享库。但NDK只支持JNI。现在我想构建一个独立的共享库,而不需要直接的JNI交互。我有很多C文件和头文件,所以我不能为所有内容编写JNI。我想建立我的ARM处理器库。我该怎么做 my stuture is ----->JNI ---->myfile.c(jni c code) ----->and

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

可以构建本机库,而无需编写任何
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>
APP\u OPTIM:=发布
应用程序平台:=android-7
APP_STL:=gnustl_static
APP_CPPFLAGS+=-frtti
APP_CPPFLAGS+=-feexceptions
APP_CPPFLAGS+=-DANDROID
APP_ABI:=armeabi-v7a
应用程序模块:=

使用
ndk build
编译库。

Android ndk对使用它构建的二进制文件的JNI遵从性没有任何要求。但通常Android应用程序是用Java编写的,当它们使用本机组件时,自然的途径是使用JNI

Android NDK提供了一个丰富且易于使用的NDK构建命令,它要求您准备至少一个由make系统使用的
Android.mk
文件。在许多情况下,基于makefile准备这样的文件是值得的。但是,如果您从另一个平台移植的项目使用高级
configure
Cmake
功能,您可以完全跳过
Android.mk
,并使用独立的工具链,该工具链是NDK的一部分,如NDK官方文档中所述。请注意,Android不支持完整的Linuxglibc,而是一个名为仿生的子集。STL的支持也不明显,你必须

您可以到此为止,获取共享库或可执行文件,并以传统的Linux方式使用它们。你可以

但最简单的方法是使用androidsdk构建javaandroid应用程序,并通过JDK调用一些本机方法。您将需要一个包装器
。因此
为此,需要一个将JNI函数导出到Java并依次调用非JNI库的库。在
Android.mk
中,您可以使用
本地共享库
引用这些库。您可能会发现以下问题对此部分有用:

您需要在Java代码中“手动”加载本机库。系统加载器仅在
/system/lib
文件夹中搜索未解析的引用

传统的位置是使用本机方法的Java类的静态构造函数。装载顺序很重要。如果
libone.so
依赖于
libtwo.so
,而
libjni.so
依赖于
libone
libtwo
,那么

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

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

是的,可以这样做。您可以基于linux中的Makefile创建Android.mk文件。一旦准备好Android make文件,就可以使用Android工具链编译该文件。我建议您查看android源代码,尤其是外部目录。这可以让你开始。你能提供更多关于如何使用从android应用程序到预构建本机库的共享库方法调用的信息吗。以及Application.mk文件应该放在哪里。