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

android jni配置流程:
1、編寫本地java類,并編寫native方法
2、生成.class文件,然后生成.h文件
注意:一般情況只要進(jìn)入到main/java 下面執(zhí)行命令 javah xxx.xx.xx.XXX 就可以了
但是如果出現(xiàn)"無法確定XXX的簽名"錯(cuò)誤的時(shí)候
執(zhí)行命令 javah -classpath {SDK路徑}\platforms\android-28\android.jar;. -jni xxx.xx.xx.XXX
3、在src/main下面創(chuàng)建jni目錄
4、放入.h文件,新建對(duì)應(yīng)的.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文件內(nèi)容

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文件內(nèi)容
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),返回當(dāng)前文件在系統(tǒng)中的路徑,Android.mk文件開始時(shí)必須定義該變量。 ·include(CLEAR_VARS),表明清除上一次構(gòu)建過程的所有全局變量,因?yàn)樵谝粋€(gè)Makefile編譯腳本中,會(huì)使用大量的全局變量,使用這行腳本表明需要清除掉所有的全局變量。 ·LOCAL_SRC_FILES,要編譯的C或者Cpp的文件,注意這里不需要列舉頭文件,構(gòu)建系統(tǒng)會(huì)自動(dòng)幫助開發(fā)者依賴這些文件。 ·LOCAL_STATIC_LIBRARIES,所依賴的靜態(tài)庫文件。 ·LOCAL_LDLIBS:=-L(SYSROOT)/usr/lib-llog-lOpenSLES-lGLESv2-lEGL-lz,指定編譯過程所依賴的NDK提供的動(dòng)態(tài)與靜態(tài)庫,SYSROOT變量代表的是NDK_ROOT下面的目錄NDK_ROOT/platforms/android-18/arch-arm,而在這個(gè)目錄的usr/lib/目錄下有很多對(duì)應(yīng)的so的動(dòng)態(tài)庫以及.a的靜態(tài)庫。 ·LOCAL_CFLAGS,編譯C或者Cpp的編譯標(biāo)志,在實(shí)際編譯的時(shí)候會(huì)發(fā)送給編譯器。比如常用的實(shí)例是加上-DAUTO_TEST,然后在代碼中就可以利用條件判斷#ifdef AUTO_TEST來做一些與自動(dòng)化測(cè)試相關(guān)的事情。 ·LOCAL_LDFLAGS,鏈接標(biāo)志的可選列表,當(dāng)對(duì)目標(biāo)文件進(jìn)行鏈接以生成輸出文件的時(shí)候,將這些標(biāo)志帶給鏈接器。該指令與LOCAL_LDLIBS有些類似,一般情況下,該選項(xiàng)會(huì)用于指定第三方編譯的靜態(tài)庫,LOCAL_LDLIBS經(jīng)常用于指定系統(tǒng)的庫(比如log、OpenGL ES、EGL等)。 ·LOCAL_MODULE,該模塊的編譯的目標(biāo)名,用于區(qū)分各個(gè)模塊,名字必須是唯一并且不包含空格的,如果編譯目標(biāo)是so庫,那么該so庫的名字就是lib項(xiàng)目名.so
·include$(BUILD_SHARED_LIBRARY),其實(shí)類似的include還有很多,都是構(gòu)建系統(tǒng)提供的內(nèi)置變量,該變量的意義是構(gòu)建動(dòng)態(tài)庫,其他的內(nèi)置變量還包括如下幾種。 ·---BUILD_STATIC_LIBRARY:構(gòu)建靜態(tài)庫。 ·---PREBUILT_STATIC_LIBRARY:對(duì)已有的靜態(tài)庫進(jìn)行包裝,使其成為一個(gè)模塊。 ·---PREBUILT_SHARED_LIBRARY:對(duì)已有的動(dòng)態(tài)庫進(jìn)行包裝,使其成為一個(gè)模塊。 ·---BUILD_EXECUTABLE:構(gòu)建可執(zhí)行文件。

Application.mk分為以下幾個(gè)部分。
·APP_ABI:=XXX,這里的XXX是指不同的平臺(tái),可以選填的有x86、mips、armeabi、armeabi-v7a、all等,值得一提的是,若選擇all則會(huì)構(gòu)建出所有平臺(tái)的so,如果不填寫該項(xiàng),那么將默認(rèn)構(gòu)建為armeabi平臺(tái)下的庫。由于工作的原因,筆者和Intel的員工打過交道,構(gòu)建armeabi-v7a平臺(tái)的so之所以可以運(yùn)行在Intel x86架構(gòu)的CPU平臺(tái)下,是因?yàn)镮ntel針對(duì)armeabi做了兼容,但是如果想要應(yīng)用以最小的能耗、最高的效率運(yùn)行在Intel x86平臺(tái)上,則還是要指定構(gòu)建的so為x86平臺(tái)。因此,如果想要提高App的運(yùn)行性能,則還需要編譯出x86平臺(tái)。類似于前面介紹的iOS平臺(tái),如果不考慮模擬器的話,則僅需要構(gòu)建armv7與arm64平臺(tái)架構(gòu),那么對(duì)于Android平臺(tái)呢?對(duì)于armv7-a,肯定是要編譯的;至于arm64-v8a這個(gè)平臺(tái),其實(shí)已經(jīng)占到了50%以上,最好也將其單獨(dú)編譯出來;同時(shí)armv5這個(gè)平臺(tái)的設(shè)備還是存在的,當(dāng)然不同App在不同架構(gòu)下的比例也不盡相同,讀者可以根據(jù)實(shí)際場景來決定編譯的平臺(tái)數(shù)目。這里需要注意的是,編譯arm64-v8a的時(shí)候使用的交叉工具編譯鏈與之前的armv7所在的目錄有比較大的差異,其目錄存在于:
·$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin ·編譯過程中使用的編譯工具都存在于上述目錄下。 ·APP_STL:=gnustl_static,NDK構(gòu)建系統(tǒng)提供了由Android系統(tǒng)給出的最小C++運(yùn)行時(shí)庫(/system/lib/libstdc++.so)的C++頭文件。然而,NDK帶有另一個(gè)C++實(shí)現(xiàn),開發(fā)者可以在自己的應(yīng)用程序中使用或鏈接它,定義APP_STL可選擇它們中的一個(gè),可選項(xiàng)包括:stlport_static、stlport_shared、gnustl_static。 ·APP_CPPFLAGS:=-std=gnu++11-fexceptions,指定編譯過程的flag,可以在該選項(xiàng)中開啟exception rtti等特性,但是為了效率考慮,最好關(guān)閉rtti。 ·NDK_TOOLCHAIN_VERSION=4.8,指定交叉工具編譯鏈里面的版本號(hào),這里指定使用4.8。
·APP_PLATFORM:=android-9,指定創(chuàng)建的動(dòng)態(tài)庫的平臺(tái)。
·APP_OPTIM:=release,該變量是可選的,用來定義“release”或“debug”,“release”模式是默認(rèn)的,并且會(huì)生成高度優(yōu)化的二進(jìn)制代碼;“debug”模式生成的是未優(yōu)化的二進(jìn)制代碼,但是可以檢測(cè)出很多的BUG,經(jīng)常用于調(diào)試階段,也相當(dāng)于在ndk-build指令后邊直接加上參數(shù)NDK_DEBUG=1。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容