欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年12月06日 11:43:40   作者:asmcvc  
這篇文章主要介紹了詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK,分享給大家,具體如下:

場景

  1. 場景一:Java層代碼與SO的開發(fā)分為不同的程序猿負責(zé),開發(fā)SO的時候基本上APK的其他文件不會修改。
  2. 場景二:主要代碼就是C++,Java層代碼也只是個DEMO,Java代碼基本沒啥修改。

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

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

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

步驟

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

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

新建一個空的解決方案,然后把自己編寫的c++的頭文件和源文件都添加進來。

image

image

設(shè)置VS工程屬性

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

image

添加頭文件包含,啟動自動代碼完成

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

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

image

配置自動化腳本

image

其中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
)

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

其中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)

這個是清理用的。

其中debug.bat腳本需要一個參數(shù),就是你當(dāng)前測試APK的包名,注意我上面調(diào)用的方式是:==call ./debug.bat com.bigsing.hooktest==,需要你測試的APP已經(jīng)在手機中安裝過,腳本會刪除已經(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會執(zhí)行編譯操作,便會調(diào)用【生成命令行】build.bat,如果代碼編寫得沒有問題,則會產(chǎn)生如下類似日志:

1>------ 已啟動生成: 項目: HookTest, 配置: Debug Win32 ------
1>正在執(zhí)行生成文件項目操作
1>[armeabi] Compile++ thumb: test <= test.cpp
1>[armeabi] SharedLibrary : libtest.so
1>[armeabi] Install : libtest.so => libs/armeabi/libtest.so
1>已復(fù)制  1 個文件。
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 個錯誤,0 個警告
========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========

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

1>------ 已啟動生成: 項目: HookTest, 配置: Debug Win32 ------
1>正在執(zhí)行生成文件項目操作
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 個錯誤,0 個警告
========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========

其實很容易找到出錯的源碼文件及對應(yīng)的行號。

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

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

借助VS和VAX強大的索引和自動完成代碼來節(jié)省開發(fā)時間,保證代碼的正確性。

2、重新編譯APK的時間

整個過程不需要重新編譯AndroidStudio工程。

3、重新簽名的時間

整個過程不需要簽名APK包。

4、安裝APK的時間

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

原理與總結(jié)

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android實現(xiàn)注冊登錄界面的實例代碼

    Android實現(xiàn)注冊登錄界面的實例代碼

    這篇文章主要介紹了Android實現(xiàn)注冊登錄界面的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • android按行讀取文件內(nèi)容的幾個方法

    android按行讀取文件內(nèi)容的幾個方法

    這篇文章主要介紹了android按行讀取文件內(nèi)容的幾個方法,java逐行讀取文件內(nèi)容的幾個方法,需要的朋友可以參考下
    2014-06-06
  • Android TextView控件文字添加下劃線的實現(xiàn)方法

    Android TextView控件文字添加下劃線的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狝ndroid TextView控件文字添加下劃線的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Android模擬器中窗口截圖存成文件實現(xiàn)思路及代碼

    Android模擬器中窗口截圖存成文件實現(xiàn)思路及代碼

    Android模擬器內(nèi)容是用OpenGL渲染的,所以用一般的編程截圖(如PrintWindow()等)會是黑屏。這是因為畫的東西放在framebuffer里 接下來介紹如何實現(xiàn)Android模擬器中窗口截圖存成文件,感興趣的朋友可以了解下哦
    2013-01-01
  • 基于linux與windows平臺下 如何下載android sdk源代碼的方法詳解

    基于linux與windows平臺下 如何下載android sdk源代碼的方法詳解

    本文主要是介紹在linux和windows平臺下,如何下載android sdk的源代碼,注意是sdk的源代碼,而不是android的所有源代碼,同時介紹如何把sdk源代碼加入到eclipse里,使android 平臺手機開發(fā)者可以直接查看源代碼,通過閱讀SDK源碼,能更好的理解和運用Android的API
    2013-05-05
  • Android WebView與JS交互全面詳解(小結(jié))

    Android WebView與JS交互全面詳解(小結(jié))

    本篇文章主要介紹了Android WebView與JS交互全面詳解(小結(jié)),實現(xiàn)了Android客戶端與Web網(wǎng)頁交互,具有一定的參考價值,有興趣的可以了解一下
    2017-11-11
  • Android Studio 導(dǎo)入新工程項目圖解

    Android Studio 導(dǎo)入新工程項目圖解

    這篇文章主要介紹了Android Studio 導(dǎo)入新工程項目圖解,需要的朋友可以參考下
    2017-12-12
  • Kotlin作用域函數(shù)應(yīng)用詳細介紹

    Kotlin作用域函數(shù)應(yīng)用詳細介紹

    作用域函數(shù):是Kotlin標(biāo)準庫中的內(nèi)聯(lián)函數(shù),作用在對象上時,執(zhí)行給定的block代碼塊。可以在block代碼塊中通過it,this代表當(dāng)前對象,進行代碼邏輯處理
    2022-08-08
  • Android 消息隊列模型詳解及實例

    Android 消息隊列模型詳解及實例

    這篇文章主要介紹了 Android 消息隊列模型詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android ViewPager小圓點指示器

    Android ViewPager小圓點指示器

    這篇文章主要為大家詳細介紹了Android ViewPager小圓點指示器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論