溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例

發(fā)布時(shí)間:2021-02-20 10:50:54 來(lái)源:億速云 閱讀:481 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

如何使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK

場(chǎng)景

  1. 場(chǎng)景一:Java層代碼與SO的開(kāi)發(fā)分為不同的程序猿負(fù)責(zé),開(kāi)發(fā)SO的時(shí)候基本上APK的其他文件不會(huì)修改。

  2. 場(chǎng)景二:主要代碼就是C++,Java層代碼也只是個(gè)DEMO,Java代碼基本沒(méi)啥修改。

常見(jiàn)的做法是:
1. 使用編輯器或者編譯器編寫(xiě)C++代碼。
2. 使用NDK命令編譯SO。
3. 重新打包APK,或者直接替換APK中的SO文件再重簽名。
4. 安裝到手機(jī)。
5. 運(yùn)行。
6. 崩潰。
7. 排錯(cuò)。

如此往復(fù),有限的時(shí)間和精力在無(wú)限的編譯和調(diào)試之中全部都耗完。

當(dāng)然會(huì)問(wèn):為啥不用AndroidStudio自帶的NDK開(kāi)發(fā),試過(guò),不好用。這里推薦一種方法,搭建很簡(jiǎn)單,使用起來(lái)很方便又節(jié)省時(shí)間,分享給大家。

步驟

以vs2008為例(高版本亦可,不知道vs2017是不是對(duì)NDK開(kāi)發(fā)支持的很好了,一直沒(méi)敢嘗試)

新建VS解決方案,添加源碼

新建一個(gè)空的解決方案,然后把自己編寫(xiě)的c++的頭文件和源文件都添加進(jìn)來(lái)。

使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例

使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例

設(shè)置VS工程屬性

項(xiàng)目屬性“常規(guī)”-“配置類型”修改為“生成文件”:

使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例

添加頭文件包含,啟動(dòng)自動(dòng)代碼完成

這里主要是把NDK開(kāi)發(fā)的include目錄包含進(jìn)來(lái), 打開(kāi)vs“工具”-“選項(xiàng)”-“項(xiàng)目和解決方案”-“VC++目錄”,設(shè)置包含文件目錄新增“D:\ndk\platforms\android-19\arch-x86\usr\include”:

使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例

手動(dòng)把D:\ndk\platforms\android-19\arch-x86\usr\include目錄下的jni.h拖入VS中打開(kāi),此時(shí)VAX開(kāi)始自動(dòng)索引,這時(shí)候JNI開(kāi)發(fā)相關(guān)的關(guān)鍵字便可以正常識(shí)別了。使用自動(dòng)提示寫(xiě)起來(lái)就比較快速,而且也不容易出錯(cuò)。

使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例

配置自動(dòng)化腳本

使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例

其中build.bat腳本:

set dir=%~dp0
set modulename=test
set modulefile=..\libs\armeabi\lib%modulename%.so
cd /d %dir%
call ./ndk.bat
if exist %modulefile% ( 
 copy %modulefile% ..\main\jniLibs\armeabi\lib%modulename%.so 
 call ./debug.bat com.bigsing.hooktest
)

編譯成功后會(huì)根據(jù)JNI在AndroidStudio項(xiàng)目工程的位置把SO文件復(fù)制到對(duì)應(yīng)的libs目錄下。最重要的步驟就是后面調(diào)用debug.bat的腳本地方,后面再說(shuō)。

其中clean.bat腳本:

set dir=%~dp0
set ndk=d:\Android\ndk\ndk-build.cmd
cd /d %dir%
if exist %ndk% ( %ndk% clean)else ( ndk-build clean)

這個(gè)是清理用的。

其中debug.bat腳本需要一個(gè)參數(shù),就是你當(dāng)前測(cè)試APK的包名,注意我上面調(diào)用的方式是:==call ./debug.bat com.bigsing.hooktest==,需要你測(cè)試的APP已經(jīng)在手機(jī)中安裝過(guò),腳本會(huì)刪除已經(jīng)存在的SO文件,然后導(dǎo)入新編譯好的SO。

set dir=%~dp0
set package=%1%
set modulename=test
set modulefile=..\libs\armeabi\lib%modulename%.so
set destso=/data/data/%package%/lib/lib%modulename%.so
cd /d %dir%
echo off
if exist %modulefile% ( 
 echo 1.delete old file: %destso%
 adb shell "su -c ' rm %destso%'"
 echo 2.push so to /data/local/tmp
 adb push %dir%%modulefile% /data/local/tmp/lib%modulename%.so
 echo 3.copy so to /data/data/%package%/lib
 adb shell "su -c ' cp /data/local/tmp/lib%modulename%.so /data/data/%package%/lib'"
 echo 4.chmod 755 so
 adb shell "su -c ' chmod 755 /data/data/%package%/lib/lib%modulename%.so'"
 echo success
 echo u can rm other data here...
 adb shell "su -c ' rm -r /data/data/%package%/databases'"
 adb shell "su -c ' rm -r /data/data/%package%/shared_prefs'"
 adb shell "su -c ' rm -r /data/data/%package%/cache'"

)else ( 
 echo error! file not found: %dir%%modulefile%
)
echo on

編譯

在VS里直接按F7會(huì)執(zhí)行編譯操作,便會(huì)調(diào)用【生成命令行】build.bat,如果代碼編寫(xiě)得沒(méi)有問(wèn)題,則會(huì)產(chǎn)生如下類似日志:

1>------ 已啟動(dòng)生成: 項(xiàng)目: HookTest, 配置: Debug Win32 ------
1>正在執(zhí)行生成文件項(xiàng)目操作
1>[armeabi] Compile++ thumb: test <= test.cpp
1>[armeabi] SharedLibrary : libtest.so
1>[armeabi] Install : libtest.so => libs/armeabi/libtest.so
1>已復(fù)制  1 個(gè)文件。
1>1.delete old file: /data/data/com.bigsing.hooktest/lib/libtest.so
1>2.push so to /data/local/tmp
1>[ 78%] /data/local/tmp/libtest.so
1>[100%] /data/local/tmp/libtest.so
1>f:\svnlocal\hooktest\app\src\jni\..\libs\armeabi\libtest.so: 1 file pushed. 3.3 MB/s (83248 bytes in 0.024s)
1>3.copy so to /data/data/com.bigsing.hooktest/lib
1>4.chmod 755 so
1>success
1>生成日志保存在“file://f:\svnlocal\hooktest\app\src\jni\src\Debug\BuildLog.htm”
1>HookTest - 0 個(gè)錯(cuò)誤,0 個(gè)警告
========== 生成: 成功 1 個(gè),失敗 0 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè) ==========

如果編譯出錯(cuò),會(huì)產(chǎn)生如下類似日志:

1>------ 已啟動(dòng)生成: 項(xiàng)目: HookTest, 配置: Debug Win32 ------
1>正在執(zhí)行生成文件項(xiàng)目操作
1>[armeabi] Compile++ thumb: test <= test.cpp
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp: In function '_jstring* Java_com_bigsing_hooktest_NativeHandler_getString(JNIEnv*, jclass, jobject, jint, jstring)':
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:35:1: error: expected unqualified-id before '}' token
1> }
1> ^
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:35:1: error: expected ';' before '}' token
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp: In function '_jstring* getInfo(JNIEnv*, jclass, jobject, jint, jstring)':
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:73:2: error: expected unqualified-id before '}' token
1> }else if((int)paramInt == 2){
1> ^
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:73:2: error: expected ';' before '}' token
1>make.exe: *** [f:/svnlocal/hooktest/app/src//obj/local/armeabi/objs/test/src/test.o] Error 1
1>生成日志保存在“file://f:\svnlocal\hooktest\app\src\jni\src\Debug\BuildLog.htm”
1>HookTest - 4 個(gè)錯(cuò)誤,0 個(gè)警告
========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè) ==========

其實(shí)很容易找到出錯(cuò)的源碼文件及對(duì)應(yīng)的行號(hào)。

節(jié)省了哪些時(shí)間?

1、蹩腳編輯器開(kāi)發(fā)C++浪費(fèi)的時(shí)間

借助VS和VAX強(qiáng)大的索引和自動(dòng)完成代碼來(lái)節(jié)省開(kāi)發(fā)時(shí)間,保證代碼的正確性。

2、重新編譯APK的時(shí)間

整個(gè)過(guò)程不需要重新編譯AndroidStudio工程。

3、重新簽名的時(shí)間

整個(gè)過(guò)程不需要簽名APK包。

4、安裝APK的時(shí)間

只需安裝一次APK包,后面調(diào)試測(cè)試的時(shí)候均無(wú)需安裝APK包。

原理與總結(jié)

只要APK安裝一次之后,它的SO路徑就固定了,就在/data/data/包名/lib/下,因此我們可以在編譯成功后,把原SO文件刪除,然后把新編譯的SO文件push到lib目錄下,最后重新運(yùn)行一下APP就會(huì)加載新的SO了。

如果擔(dān)心數(shù)據(jù)緩存會(huì)對(duì)測(cè)試造成影響,則可以在腳本中編寫(xiě)刪除緩存文件的命令(上面的腳本會(huì)刪除cache、database、shared_prefs目錄),如果有需要還可以編寫(xiě)自動(dòng)殺死已經(jīng)在運(yùn)行的APP并自動(dòng)打開(kāi)的命令。

關(guān)于“使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK的案例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI