Android Studio調(diào)試NDK

記得之前做飲料售賣(mài)機(jī)的支付模塊
筆者用的jni下串口通信,那個(gè)時(shí)候沒(méi)有用調(diào)試(主要不知道怎么調(diào)試底層),只得打出日志分析,非常痛苦,不過(guò)項(xiàng)目經(jīng)歷也令人難忘,成長(zhǎng)不少。

最近發(fā)現(xiàn)Android Studio對(duì)NDK的調(diào)試支持越來(lái)越好了,在網(wǎng)上整理了很多經(jīng)驗(yàn)帖,重走一遍,記錄一下
新建項(xiàng)目NDKCode
新建文件cn.byhook.lib.LibCode.java

public class LibCode {

    static {
        System.loadLibrary("code");
    }

    public native String getMessage();
}

用javah生成對(duì)應(yīng)的頭文件LibCode.h
或者自定義菜單External Tools生成

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_byhook_lib_LibCode */

#ifndef _Included_cn_byhook_lib_LibCode
#define _Included_cn_byhook_lib_LibCode
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     cn_byhook_lib_LibCode
 * Method:    get
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_cn_byhook_lib_LibCode_getMessage
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

對(duì)應(yīng)的源文件

#include "LibCode.h"

JNIEXPORT jstring JNICALL Java_cn_byhook_lib_LibCode_getMessage
  (JNIEnv * env, jobject thiz)
{
    int vCode = 10;
    return (*env)->NewStringUTF(env, "Message ...");
}

目錄結(jié)構(gòu)


在根目錄下的build.gradle中添加

classpath 'com.android.tools.build:gradle-experimental:0.7.0'

如圖所示


對(duì)應(yīng)的gradle版本

而Module中的build.gradle配置
首先將

apply plugin: 'com.android.application'

改為

apply plugin: 'com.android.model.application'

在android外層加上model
如下

model {

    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.3"

        defaultConfig {
            applicationId "cn.byhook.ndkcode"
            minSdkVersion.apiLevel = 10
            targetSdkVersion.apiLevel = 23
        }

        ndk {
            moduleName = 'code'
            toolchain = 'clang'
            CFlags.addAll(['-Wall'])
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles.add(file("proguard-rules.pro"))
            }
        }

        productFlavors {
            create("arm") {
                ndk.abiFilters.add("armeabi")
            }
            create("arm7") {
                ndk.abiFilters.add("armeabi-v7a")
            }
            create("arm8") {
                ndk.abiFilters.add("arm64-v8a")
            }
            create("x86") {
                ndk.abiFilters.add("x86")
            }
            create("x86-64") {
                ndk.abiFilters.add("x86_64")
            }
            create("mips") {
                ndk.abiFilters.add("mips")
            }
            create("mips-64") {
                ndk.abiFilters.add("mips64")
            }
            create("all")
        }
    }
}

注意要去掉原有的

minSdkVersion 9
targetSdkVersion 22

改為

minSdkVersion.apiLevel = 10
targetSdkVersion.apiLevel = 23

moduleName填寫(xiě)你要生成的模塊名稱(chēng)

配置調(diào)試器

如果報(bào)錯(cuò)
點(diǎn)擊Fix,安裝好LLDB,然后點(diǎn)擊OK即可

MainActivity中調(diào)用

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final LibCode mLibCode = new LibCode();
        Toast.makeText(this, "" + mLibCode.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

接下來(lái),如圖所示打上斷點(diǎn)

選中NDK-Debug配置
調(diào)試起來(lái)

現(xiàn)在已經(jīng)非常方便了

本開(kāi)源庫(kù)地址
https://github.com/byhook/NDKCode

參考
官方文檔
http://tools.android.com/tech-docs/new-build-system/gradle-experimental
官方開(kāi)源庫(kù)集成Gradle Experimental Android plugin
https://github.com/googlesamples/android-ndk
zzyyppqq
http://www.itdecent.cn/p/7844aafe897d

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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