由於要在舊版android在作一些工做。因此作用到了它。目標平臺是:android api 10和armv6. 開發環境是:AS 版本2.3.2; SDK版配android 2.3.3(api10); NDK版本android-ndk-r10e這個必需,後面版本對armv6有點問題,我試的r13b就是gdbserv er不運行,好似這些版本從armv7開始了. gradle的版本關係不大,我用的是4.7.android
這些基本的開改環境安裝好就開始配成開發JNI 本地代碼的三種方法三有:直接用gradle的任務與NDK中的ndk-build和ndk-gbdl; 用Gradle_Experimental,這個也是用ndk-build,作了一些gradle的工具,但如今有更新的方法不建議用這個。 新工程用CMAKE與LLDB吧,LLDB由於沒找到armv6的編譯版本,我自已雙不想去編譯,LLDB是LLVM下的一個工具,其工程和android源碼有點相似,要總體下了配置編譯,只編譯一部分,大約問題會太多,我就沒去試。用gdb原生工具適應度寬一點。配本上是LINUX的地方均可用。windows
第一步,生成新工程,api
在生成新工程時選擇支持C++,別的基本不用動,這樣配出來的基本上就是用CMAKE開發的環境。我生成新工程時,由於AS網上下東西就卡死了,我斷網後,AS不下東西,就生成新工程經過了。而後手工在文件中改配。我生成的代碼中帶一個簡單的C調用。就用它作配置測試。app
先用CMAKE有的環境作了測試。基本上不用動就是編譯經過的,若是出小問題網上找一下吧。由於每一個人的開發環境可能不同。這裏先試一下CMAKE, Cmake在android-ndk-r10e下是不能用的。我用的是android-ndk-r13b,在armv6可運行,但因LLDB-server不運行,因此不能調試。ide
第二步,在gradle配置中去CMAKE, 配ndk-build。相關的文件是gradle.properties,這裏加入工具
#for NDK-build
Android.useDeprecatedNdk=true
主要的改動在這裏build.gradle(APP)這個是APP 目錄下的。註釋去CMAKE相關部分。測試
/*externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'armeabi'
}*/
/*externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}*/
整個文件出來吧gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "28.0.1"
defaultConfig {
applicationId "com.home.ququ.videotest"
minSdkVersion 9
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
/*externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'armeabi'
}*/
//gradle test task
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
debuggable true
}
//for NDK-build maked .so \Videotest\app\src\main\jniLibs
sourceSets {
main {
jni.srcDirs = []
//jniLibs.srcDirs = ['libs']
}
}
}
/*externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}*/
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
task hello {
println 'Hello world!'
}
//for NDK-build
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
commandLine 'D:\\android-ndk\\android-ndk-r10e\\ndk-build.cmd ',//這裏本地ndk的路徑
'NDK_DEBUG=1',
'NDK_PROJECT_PATH=D:\\androidproject\\Videotest\\app\\src\\main\\',
'NDK_LIBS_OUT=D:\\androidproject\\Videotest\\app\\src\\main\\jniLibs',
'APP_BUILD_SCRIPT=./src/main/jni/Android.mk',
'NDK_APPLICATION_MK=./src/main/jni/Application.mk'
}
//when build do it
preBuild.dependsOn ndkBuild
task hello是我寫gralde任短務時作測試。命令行調用任務是在build.gradle同目錄下,ui
D:\Android-Studio\gradle\gradle-4.7\bin\(gradle的安裝目錄)gradle hello.net
初次調用,要下一些東西,有點慢。再調用就快了。
ndk-build的編譯工做主要是經過任務ndkbuild. 我是用命令行調好了纔在這裏改的。最後一行指示build在在編譯前調用這個任務。
preBuild.dependsOn ndkBuild
任務也能夠直接用gradle ndkbuild在terminal下調用。把gradle的安裝目錄windows的環境變量就要不用寫路徑了。由於寫了編譯前調用這個路戲不加了。只是把ndk-guild.cmd加入windows的環境變量。由於後面的GDB是命令操做方式。
這樣編譯,運行吧,個人環境下沒問題。到目示平臺上一切正常。電腦開不起仿直器,有點舊了,好卡。
忘了一點,要寫.mk文件的。默認生成的CPP文件在CPP 目錄下。ndk-guild默認找到是JNI目錄。這個可配,我是重配到JNI目錄了。這個目錄下要加兩個.mk文件,用於編譯指示。(CMAKE用的CMAKELISTS.txt配方不一樣)
Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI :=armeabi
Android.mk
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=native-lib
LOCAL_SRC_FILES :=native-lib.cpp
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog
include $(BUILD_SHARED_LIBRARY)
都是編譯選項,有些是android 特有的。能夠看一些關於mk的語法,若是隻寫一個庫,就用這個無例子改一下名字就可。
可能遇到的錯語,
1,run-as錯誤,這個有人說是修改一下NDK的腳本,其說法是有道理的,不過我一點點分析緣由,是不調用是由於android的APP安裝數據文件不對。我把它手機改對了,修改腳本可能也解決這個問題。修的是NDK-gdb的調試腳本,這個我沒去試。直接改android的數據文件,指示run-as,調用時要找的數據項。
「我這裏直接給DATA_DIR賦值爲app目錄:/data/data/com.umonistudio.tile。這步驟很重要,不然你會遇到run-as之類的錯誤,致使沒法繼續調試!」
2,app_process錯語,這個把android的 /system/bin目錄下的adb pull出一個到
(工程錄)\app\src\main\obj\local\armeabi下就能夠了。
4,ndk-gdb的調用腳本是我這個是舊版是PY寫的。--verbose是打印執行命令的一些信息,方便找錯。--nowait,讓代碼停在適當的位置。
ndk-gdb-py --verbose --start --nowait --adb D:\android-sdk\platform-tools\adb.exe