美文网首页
Android jni配置流程及mk文件字段

Android jni配置流程及mk文件字段

作者: SuperTypeMen | 来源:发表于2019-07-29 20:17 被阅读0次

android jni配置流程:
1、编写本地java类,并编写native方法
2、生成.class文件,然后生成.h文件
注意:一般情况只要进入到main/java 下面执行命令 javah xxx.xx.xx.XXX 就可以了
但是如果出现"无法确定XXX的签名"错误的时候
执行命令 javah -classpath {SDK路径}\platforms\android-28\android.jar;. -jni xxx.xx.xx.XXX
3、在src/main下面创建jni目录
4、放入.h文件,新建对应的.c文件
5、编写Android.mk和Application.mk文件
6、app.gradle配置
ndk {
moduleName "gaclient"
abiFilters 'armeabi-v7a','x86'
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jni']
}
7、Android.mk文件内容

LOCAL_PATH := $(call my-dir)

TARGET_PLATFORM := android-14

include $(LOCAL_PATH)/Android.prebuilt.full

include (CLEAR_VARS) LOCAL_MODULE := gaclient ifeq ((TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_ARM_MODE := arm
LOCAL_ARM_NEON := true
endif
LOCAL_CFLAGS := -Wno-psabi -DANDROID -D__STDC_CONSTANT_MACROS -DGL_GLEXT_PROTOTYPES #-DANDROID_NO_FFMPEG
LOCAL_LDFLAGS += -L(LOCAL_PATH)/(TARGET_ARCH_ABI)/lib/

-D__STDINT_LIMITS

LOCAL_C_INCLUDES := (LOCAL_PATH)/(TARGET_ARCH_ABI)/include (LOCAL_PATH)/(TARGET_ARCH_ABI)/include/live555
LOCAL_SRC_FILES := src/ga-common.cpp src/ga-conf.cpp src/ga-confvar.cpp
src/ga-avcodec.cpp src/dpipe.cpp src/vconverter.cpp
src/rtspconf.cpp src/controller.cpp src/ctrl-sdl.cpp src/ctrl-msg.cpp
src/libgaclient.cpp src/rtspclient.cpp
src/qosreport.cpp
src/minih264.cpp src/minivp8.cpp
src/android-decoders.cpp \

The order matters ...

LOCAL_STATIC_LIBRARIES :=
liveMedia BasicUsageEnvironment UsageEnvironment groupsock
swscale swresample postproc avdevice avfilter avformat avcodec avutil
theora theoradec theoraenc vpx
LOCAL_SHARED_LIBRARIES := mp3lame opus ogg vorbis vorbisenc vorbisfile x264
LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true

LOCAL_LDLIBS := -llog -lz -lGLESv1_CM -fPIC
include $(BUILD_SHARED_LIBRARY)

8、Application.mk文件内容
APP_MODULES := gaclient
APP_PLATFORM := android-9
APP_CPPFLAGS += -fexceptions
APP_ABI := armeabi-v7a x86
APP_STL := gnustl_shared
APP_ALLOW_MISSING_DEPS=true

Android.mk字段详解:

·LOCAL_PATH:=(call my-dir),返回当前文件在系统中的路径,Android.mk文件开始时必须定义该变量。 ·include(CLEAR_VARS),表明清除上一次构建过程的所有全局变量,因为在一个Makefile编译脚本中,会使用大量的全局变量,使用这行脚本表明需要清除掉所有的全局变量。 ·LOCAL_SRC_FILES,要编译的C或者Cpp的文件,注意这里不需要列举头文件,构建系统会自动帮助开发者依赖这些文件。 ·LOCAL_STATIC_LIBRARIES,所依赖的静态库文件。 ·LOCAL_LDLIBS:=-L(SYSROOT)/usr/lib-llog-lOpenSLES-lGLESv2-lEGL-lz,指定编译过程所依赖的NDK提供的动态与静态库,SYSROOT变量代表的是NDK_ROOT下面的目录NDK_ROOT/platforms/android-18/arch-arm,而在这个目录的usr/lib/目录下有很多对应的so的动态库以及.a的静态库。 ·LOCAL_CFLAGS,编译C或者Cpp的编译标志,在实际编译的时候会发送给编译器。比如常用的实例是加上-DAUTO_TEST,然后在代码中就可以利用条件判断#ifdef AUTO_TEST来做一些与自动化测试相关的事情。 ·LOCAL_LDFLAGS,链接标志的可选列表,当对目标文件进行链接以生成输出文件的时候,将这些标志带给链接器。该指令与LOCAL_LDLIBS有些类似,一般情况下,该选项会用于指定第三方编译的静态库,LOCAL_LDLIBS经常用于指定系统的库(比如log、OpenGL ES、EGL等)。 ·LOCAL_MODULE,该模块的编译的目标名,用于区分各个模块,名字必须是唯一并且不包含空格的,如果编译目标是so库,那么该so库的名字就是lib项目名.so
·include$(BUILD_SHARED_LIBRARY),其实类似的include还有很多,都是构建系统提供的内置变量,该变量的意义是构建动态库,其他的内置变量还包括如下几种。 ·---BUILD_STATIC_LIBRARY:构建静态库。 ·---PREBUILT_STATIC_LIBRARY:对已有的静态库进行包装,使其成为一个模块。 ·---PREBUILT_SHARED_LIBRARY:对已有的动态库进行包装,使其成为一个模块。 ·---BUILD_EXECUTABLE:构建可执行文件。

Application.mk分为以下几个部分。
·APP_ABI:=XXX,这里的XXX是指不同的平台,可以选填的有x86、mips、armeabi、armeabi-v7a、all等,值得一提的是,若选择all则会构建出所有平台的so,如果不填写该项,那么将默认构建为armeabi平台下的库。由于工作的原因,笔者和Intel的员工打过交道,构建armeabi-v7a平台的so之所以可以运行在Intel x86架构的CPU平台下,是因为Intel针对armeabi做了兼容,但是如果想要应用以最小的能耗、最高的效率运行在Intel x86平台上,则还是要指定构建的so为x86平台。因此,如果想要提高App的运行性能,则还需要编译出x86平台。类似于前面介绍的iOS平台,如果不考虑模拟器的话,则仅需要构建armv7与arm64平台架构,那么对于Android平台呢?对于armv7-a,肯定是要编译的;至于arm64-v8a这个平台,其实已经占到了50%以上,最好也将其单独编译出来;同时armv5这个平台的设备还是存在的,当然不同App在不同架构下的比例也不尽相同,读者可以根据实际场景来决定编译的平台数目。这里需要注意的是,编译arm64-v8a的时候使用的交叉工具编译链与之前的armv7所在的目录有比较大的差异,其目录存在于:
·$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin ·编译过程中使用的编译工具都存在于上述目录下。 ·APP_STL:=gnustl_static,NDK构建系统提供了由Android系统给出的最小C++运行时库(/system/lib/libstdc++.so)的C++头文件。然而,NDK带有另一个C++实现,开发者可以在自己的应用程序中使用或链接它,定义APP_STL可选择它们中的一个,可选项包括:stlport_static、stlport_shared、gnustl_static。 ·APP_CPPFLAGS:=-std=gnu++11-fexceptions,指定编译过程的flag,可以在该选项中开启exception rtti等特性,但是为了效率考虑,最好关闭rtti。 ·NDK_TOOLCHAIN_VERSION=4.8,指定交叉工具编译链里面的版本号,这里指定使用4.8。
·APP_PLATFORM:=android-9,指定创建的动态库的平台。
·APP_OPTIM:=release,该变量是可选的,用来定义“release”或“debug”,“release”模式是默认的,并且会生成高度优化的二进制代码;“debug”模式生成的是未优化的二进制代码,但是可以检测出很多的BUG,经常用于调试阶段,也相当于在ndk-build指令后边直接加上参数NDK_DEBUG=1。

查看方法描述符:javap -verbose SimpleClass.class

相关文章

网友评论

      本文标题:Android jni配置流程及mk文件字段

      本文链接:https://www.haomeiwen.com/subject/glbirctx.html