1.Create Android Studio Project
成都創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕十載,專業(yè)且經(jīng)驗(yàn)豐富。十載網(wǎng)站優(yōu)化營銷經(jīng)驗(yàn),我們已為上千余家中小企業(yè)提供了成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)解決方案,按需定制制作,設(shè)計(jì)滿意,售后服務(wù)無憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!
(1)新建一個(gè)Empty Activity工程:TestNDK
(2)在工程的主Activity中加入對.so的引用.這步很關(guān)鍵,將System loadLibrary放入主Activity,是讓程序啟動(dòng)后立刻加載.so,否則后面調(diào)試時(shí),會有些麻煩
static {
// Load native library to invoke chreographerCallback().
System.loadLibrary("DebugNDK");
}
public native String stringFromJNI();
(3)使用javah生成相應(yīng)的.h文件
在Android Studio的Terminal窗口中輸入:
cd app\src\main\java #進(jìn)入工程的app\src\main\java目錄
javah stable.testndk.MainActivity #生成.h文件,stable.testndk是包名,MainActivity是native函數(shù)所在的類名
接下來就可以編譯NDK了,NDK編譯完再回來
(4)將NDK編譯出的libs目錄下的文件copy到app\libs目錄下,如下:
app\libs\armeabi\
gdb.setup
gdbserver
libDebugNDK.so
app\libs\armeabi-v7a\
gdb.setup
gdbserver
libDebugNDK.so
app\libs\mips\
gdb.setup
gdbserver
libDebugNDK.so
app\libs\x86\
gdb.setup
gdbserver
libDebugNDK.so
(5)修改app\build.gradle,在android下加入如下代碼,告知jniLibs所在目錄
sourceSets {
main() {
jniLibs.srcDirs = ['libs']
}
}
(6)rebuild工程,可以通過Build->Build APK來生成APK,然后用7Zip看一下里面是將.so打包進(jìn)去了.
接下來進(jìn)入第三步調(diào)試NDK
2.NDK程序的編譯
(1)以 android-ndk-r10b\samples\hello-jni為模板,建立自己的NDK程序(DebugNDK).
自己的程序需要修改Android.mk文件,增加工程及代碼文件,這里將所有的hello-jni更改為DebugNDK.
修改DebugNDK.c中的jni對外接口函數(shù)名,修改為上面使用javah到處的.h中的相應(yīng)函數(shù)(Java_stable_testndk_MainActivity_stringFromJNI).
(2)編譯.so
在windows命令行下,進(jìn)入工程目錄(TestNDK目錄),輸入如下命令:
ndk-build NDK_DEBUG=1 #注意事先要將ndk-build所在目錄設(shè)置到系統(tǒng)環(huán)境變量中
之后開始編譯,最終在工程目錄下會生成libs和obj兩個(gè)目錄,其中l(wèi)ibs目錄下的是發(fā)布到硬件的.so, obj下是用于調(diào)試的,后面會用到.
好了到此可以回到 上面?zhèn)€ Create Android Studio Project 的第4步了.
3.NDK調(diào)試
服務(wù)器端配置
(1)在手機(jī)上運(yùn)行TestNDK程序
(2)將編譯NDK程序時(shí)生成的gdbserver pull到手機(jī)(我是放到/data/data/stable.testndk.
gdbserver在app\libs\x86\下,可以將其放到手機(jī) /data/data/stable.testndk/lib 下
在windows命令行下,執(zhí)行:
adb push .\app\libs\x86\gdbserver /data/data/stable.testndk/lib/
(3)在手機(jī)上啟動(dòng)gdbserver并attach你想調(diào)試的進(jìn)程,并指定監(jiān)聽調(diào)試命令的端口(此端口是手機(jī)上的端口)
在windows命令行下,執(zhí)行:
adb shell #進(jìn)入手機(jī)
cd /data/data/stable.testndk/lib
ps | grep stable.testndk #查看要調(diào)試進(jìn)程的PID
gdbserver :1818 --attach 19906 #:1818是端口號,19906 是進(jìn)程ID
此時(shí),終端終端上會顯示:
Attached; pid = 19906
Listening on port 1818
臺式機(jī)端配置
(1)使用adb做端口映射,將pc機(jī)上的端口定向到手機(jī)上gdbserver監(jiān)聽的端口
adb forward tcp:1818 tcp:1818 #端口映射,將pc機(jī)的1818端口映射到手機(jī)的1818端口
(2)將設(shè)備上的app_process32拉到臺式機(jī),用于gdb調(diào)試.
adb pull /system/bin/app_process32 ./
(3)使用android-ndk-r10b\toolchains下的gdb客戶端去連接gdbserver,gdb的類型要選擇針對手機(jī)平臺的,由于我使用的手機(jī)是x86 PC模擬器,因此要選擇:
android-ndk-r10b\toolchains\x86-4.8\prebuilt\windows-x86_64\bin\i686-linux-android-gdb.exe
并且gdb版本要和gdbserver一致。(可以通過--version來確認(rèn))
在windows命令行下,執(zhí)行如下命令,app_process32_path 表示app_process32所在目錄。
android-ndk-r10b\toolchains\x86-4.8\prebuilt\windows-x86_64\bin\i686-linux-android-gdb.exe {app_process32_path}\app_process32
上面的命令執(zhí)行完后,便進(jìn)入gdb命令模式了(命令行前有(gdb)),然后執(zhí)行:
target remote :1818 #連接本地的:1234端口,此端口已經(jīng)和手機(jī)的1234端口做好映射。
set solib-search-path {solibpath} #加載所有的動(dòng)態(tài)連接庫,solibpath的路徑位置可以參考:NDK編譯輸出文件 gdb.setup 中的"set solib-search-path XXX"的目錄,但注意要使用絕對目錄.
#我的是set solib-search-path D:/Android/android-ndk-r10b/samples/TestNDK/obj/local/x86
然后用info shared命令查看是否libDebugNDK.so的符號庫已經(jīng)加載,我的顯示的是:
0xaabd92e0 0xaabd93c8 Yes D:\Android\android-ndk-r10b\samples\TestNDK\obj\local\x86\libDebugNDK.so #如果符號庫未加載則在Yes后有個(gè)(*).
(4)設(shè)置斷點(diǎn),開始調(diào)試
在gdb模式,執(zhí)行:
b Java_stable_testndk_MainActivity_stringFromJNI #設(shè)置斷點(diǎn)
c #運(yùn)行
然后在函數(shù)調(diào)用時(shí),斷點(diǎn)就可以停住了! Over!
分享名稱:使用ndk-gdb調(diào)試AS下的Native程序
文章轉(zhuǎn)載:http://www.rwnh.cn/article26/phoojg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站內(nèi)鏈、手機(jī)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、ChatGPT、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)