在android studio下配置gradle用ndk-build和ndk-gbd編譯調試JNI

由於要在舊版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

相關文章
相關標籤/搜索