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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335