導航:首頁 > 操作系統 > androidndkr9linux

androidndkr9linux

發布時間:2022-08-29 05:00:27

A. 怎樣解壓android-ndk-r9d-linux-x86

你這個包是Linux版的
解壓
先cd到你那個文件目錄
然會執行
tar jxvf android-ndk-r9d-linux-x86.tar.bz2
配置環境(den系類的Linux系統)
sudo ./make-standalone-toolchain.sh --platform=android-18 --ndk-dir=/home/ndk/ --install-dir=/opt/android-18-toolchain/

B. android ndk編譯arm-linux平台可執行程序

既然是移植就不能再用原來的Android ndk進行編譯了吧,不能圖省事啊,要移植當然要換編譯環境重新編譯,Android ndk編譯不出arm-linux程序的,要重新寫Makefile也沒辦法呀,還是交叉編譯吧。

C. 如何定位Android NDK開發中遇到的錯誤

NDK編譯生成的.so文件作為程序的一部分,在運行發生異常時同樣會造成程序崩潰。不同於Java代碼異常造成的程序崩潰,在NDK的異常發生時,程序在Android設備上都會立即退出,即通常所說的閃退,而不會彈出「程序xxx無響應,是否立即關閉」之類的提示框。

NDK是使用C/C++來進行開發的,熟悉C/C++的程序員都知道,指針和內存管理是最重要也是最容易出問題的地方,稍有不慎就會遇到諸如內存無效訪問、無效對象、內存泄露、堆棧溢出等常見的問題,最後都是同一個結果:程序崩潰。例如我們常說的空指針錯誤,就是當一個內存指針被置為空(NULL)之後再次對其進行訪問;另外一個經常出現的錯誤是,在程序的某個位置釋放了某個內存空間,而後在程序的其他位置試圖訪問該內存地址,這就會產生一個無效地址錯誤。常見的錯誤類型如下:

初始化錯誤

訪問錯誤

數組索引訪問越界

指針對象訪問越界

訪問空指針對象

訪問無效指針對象

迭代器訪問越界

內存泄露

參數錯誤

堆棧溢出

類型轉換錯誤

數字除0錯誤

利用Android NDK開發本地應用的時候,幾乎所有的程序員都遇到過程序崩潰的問題,但它的崩潰會在logcat中列印一堆看起來類似天書的堆棧信息,讓人舉足無措。單靠添加一行行的列印信息來定位錯誤代碼做在的行數,無疑是一件令人崩潰的事情。在網上搜索「Android NDK崩潰」,可以搜索到很多文章來介紹如何通過Android提供的工具來查找和定位NDK的錯誤,但大都晦澀難懂。下面以一個實際的例子來說明,首先生成一個錯誤,然後演示如何通過兩種不同的方法,來定位錯誤的函數名和代碼行。

首先,看我們在hello-jni程序的代碼中做了什麼(有關如何創建或導入工程,此處略),看下圖:在JNI_OnLoad()的函數中,即so載入時,調用willCrash()函數,而在willCrash()函數中,std::string的這種賦值方法會產生一個空指針錯誤。這樣,在hello-jni程序載入時就會閃退。我們記一下這兩個行數:在61行調用了willCrash()函數;在69行發生了崩潰。

下面來看看發生崩潰(閃退)時系統列印的logcat日誌:

[plain] view plain

************************************************

Buildfingerprint:'vivo/bbk89_cmcc_jb2/bbk89_cmcc_jb2:4.2.1/JOP40D/1372668680:user/test-keys'

pid:32607,tid:32607,name:xample.hellojni>>>com.example.hellojni<<<

signal11(SIGSEGV),code1(SEGV_MAPERR),faultaddr00000000

backtrace:

#00pc00023438/system/lib/libc.so

#01pc00004de8/data/app-lib/com.example.hellojni-2/libhello-jni.so

#02pc000056c8/data/app-lib/com.example.hellojni-2/libhello-jni.so

#03pc00004fb4/data/app-lib/com.example.hellojni-2/libhello-jni.so

#04pc00004f58/data/app-lib/com.example.hellojni-2/libhello-jni.so

#05pc000505b9/system/lib/libdvm.so

#06pc00068005/system/lib/libdvm.so

#07pc000278a0/system/lib/libdvm.so

#08pc0002b7fc/system/lib/libdvm.so

#09pc00060fe1/system/lib/libdvm.so

#10pc0006100b/system/lib/libdvm.so

#11pc0006c6eb/system/lib/libdvm.so

#12pc00067a1f/system/lib/libdvm.so

#13pc000278a0/system/lib/libdvm.so

#14pc0002b7fc/system/lib/libdvm.so

#15pc00061307/system/lib/libdvm.so

#16pc0006912d/system/lib/libdvm.so

#17pc000278a0/system/lib/libdvm.so

#18pc0002b7fc/system/lib/libdvm.so

#19pc00060fe1/system/lib/libdvm.so

#20pc00049ff9/system/lib/libdvm.so

#21pc0004d419/system/lib/libandroid_runtime.so

#22pc0004e1bd/system/lib/libandroid_runtime.so

#23pc00001d37/system/bin/app_process

#24pc0001bd98/system/lib/libc.so

#25pc00001904/system/bin/app_process

stack:

beb12340012153f8

beb1234400054290

beb1234800000035

beb1234cbeb123c0[stack]

……

如果你看過logcat列印的NDK錯誤時的日誌就會知道,我省略了後面很多的內容,很多人看到這么多密密麻麻的日誌就已經頭暈腦脹了,即使是很多資深的Android開發者,在面對NDK日誌時也大都默默的選擇了無視。

「符號化」NDK錯誤信息的方法

其實,只要你細心的查看,再配合Google提供的工具,完全可以快速的准確定位出錯的代碼位置,這個工作我們稱之為「符號化」。需要注意的是,如果要對NDK錯誤進行符號化的工作,需要保留編譯過程中產生的包含符號表的so文件,這些文件一般保存在$PROJECT_PATH/obj/local/目錄下。

第一種方法:ndk-stack

這個命令行工具包含在NDK工具的安裝目錄,和ndk-build和其他一些常用的NDK命令放在一起,比如在我的電腦上,其位置是/android-ndk-r9d/ndk-stack。根據Google官方文檔,NDK從r6版本開始提供ndk-stack命令,如果你用的之前的版本,建議還是盡快升級至最新的版本。使用ndk –stack命令也有兩種方式

使用ndk-stack實時分析日誌

在運行程序的同時,使用adb獲取logcat日誌,並通過管道符輸出給ndk-stack,同時需要指定包含符號表的so文件位置;如果你的程序包含了多種CPU架構,在這里需求根據錯誤發生時的手機CPU類型,選擇不同的CPU架構目錄,如:

[plain] view plain

adbshelllogcat|ndk-stack-sym$PROJECT_PATH/obj/local/armeabi


當崩潰發生時,會得到如下的信息:

[plain] view plain

**********Crashmp:**********

Buildfingerprint:'vivo/bbk89_cmcc_jb2/bbk89_cmcc_jb2:4.2.1/JOP40D/1372668680:user/test-keys'

pid:32607,tid:32607,name:xample.hellojni>>>com.example.hellojni<<<

signal11(SIGSEGV),code1(SEGV_MAPERR),faultaddr00000000

Stackframe#00pc00023438/system/lib/libc.so(strlen+72)

Stackframe#01pc00004de8/data/app-lib/com.example.hellojni-2/libhello-jni.so(std::char_traits<char>::length(charconst*)+20):Routinestd::char_traits<char>::length(charconst*)at/android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/char_traits.h:229

Stackframe#02pc000056c8/data/app-lib/com.example.hellojni-2/libhello-jni.so(std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string(charconst*,std::allocator<char>const&)+44):Routinebasic_stringat/android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/_string.c:639

Stackframe#03pc00004fb4/data/app-lib/com.example.hellojni-2/libhello-jni.so(willCrash()+68):RoutinewillCrash()at/home/testin/hello-jni/jni/hello-jni.cpp:69

Stackframe#04pc00004f58/data/app-lib/com.example.hellojni-2/libhello-jni.so(JNI_OnLoad+20):RoutineJNI_OnLoadat/home/testin/hello-jni/jni/hello-jni.cpp:61

Stackframe#05pc000505b9/system/lib/libdvm.so(dvmLoadNativeCode(charconst*,Object*,char**)+516)

Stackframe#06pc00068005/system/lib/libdvm.so

Stackframe#07pc000278a0/system/lib/libdvm.so

Stackframe#08pc0002b7fc/system/lib/libdvm.so(dvmInterpret(Thread*,Methodconst*,JValue*)+180)

Stackframe#09pc00060fe1/system/lib/libdvm.so(dvmCallMethodV(Thread*,Methodconst*,Object*,bool,JValue*,std::__va_list)+272)

……(後面略)

我們重點看一下#03和#04,這兩行都是在我們自己生成的libhello-jni.so中的報錯信息,那麼會發現如下關鍵信息:

[plain] view plain

#03(willCrash()+68):RoutinewillCrash()at/home/testin/hello-jni/jni/hello-jni.cpp:69

#04(JNI_OnLoad+20):RoutineJNI_OnLoadat/home/testin/hello-jni/jni/hello-jni.cpp:61


回想一下我們的代碼,在JNI_OnLoad()函數中(第61行),我們調用了willCrash()函數;在willCrash()函數中(第69行),我們製造了一個錯誤。這些信息都被准確無誤的提取了出來!是不是非常簡單?

先獲取日誌,再使用ndk-stack分析

這種方法其實和上面的方法沒有什麼大的區別,僅僅是logcat日誌獲取的方式不同。可以在程序運行的過程中將logcat日誌保存到一個文件,甚至可以在崩潰發生時,快速的將logcat日誌保存起來,然後再進行分析,比上面的方法稍微靈活一點,而且日誌可以留待以後繼續分析。

[plain] view plain

adbshelllogcat>1.log

ndk-stack-sym$PROJECT_PATH/obj/local/armeabi–mp1.log

第二種方法:使用addr2line和objmp命令

這個方法適用於那些,不滿足於上述ndk-stack的簡單用法,而喜歡刨根問底的程序員們,這兩個方法可以揭示ndk-stack命令的工作原理是什麼,盡管用起來稍微麻煩一點,但是可以滿足一下程序員的好奇心。

先簡單說一下這兩個命令,在絕大部分的linux發行版本中都能找到他們,如果你的操作系統是linux,而你測試手機使用的是Intel x86系列,那麼你使用系統中自帶的命令就可以了。然而,如果僅僅是這樣,那麼絕大多數人要絕望了,因為恰恰大部分開發者使用的是Windows,而手機很有可能是armeabi系列。

別急,在NDK中自帶了適用於各個操作系統和CPU架構的工具鏈,其中就包含了這兩個命令,只不過名字稍有變化,你可以在NDK目錄的toolchains目錄下找到他們。以我的Mac電腦為例,如果我要找的是適用於armeabi架構的工具,那麼他們分別為arm-linux-androideabi-addr2line和arm-linux-androideabi-objmp;位置在下面目錄中,後續介紹中將省略此位置:

[plain] view plain

/Developer/android_sdk/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/

假設你的電腦是windows,CPU架構為mips,那麼你要的工具可能包含在這個目錄中:

[plain] view plain

D:android-ndk-r9d oolchainsmipsel-linux-android-4.8prebuiltwindows-x86_64in

D. linux下怎麼判斷ndk環境變數ok了

打開我的電腦--屬性--高級--環境變數 2 新建系統變數path 變數名:PATH 變數值:C:\android-ndk-r9d 如果存在Path,則在變數值後面加分號,再添加C:\android-ndk-r9d END 檢測是否成功 1 打開cmd命令行,輸入ndk-build出現如下字元即可

E. 解壓完android-ndk-r9c後怎樣安裝,還有用不用在安裝SDK

android-ndk-r9c解壓後在配置一個環境變數ANDROID_NDK_ROOT,解壓ndk的目錄,之後就可以直接用來開發動態庫文件,也就是後綴名是.so文件。ndk只是用來編寫 動態庫文件的,如果不想寫apk就不需要sdk。y
SDK是用來開發手機apk的,是集成了很多的類庫。

F. android-ndk-r10e-linux-x86.bin 怎麼用

一,
1,可以試試直接用bash運行文件。試試命令 bash android-ndk-r10c-linux-x86_64(1).bin

2, 如果還不行,建議更改一下文件的名字,可能是帶了特殊的符號,如括弧。改成簡單的名字
3,最好講文件的許可權屬性發一個出來,有助於分析。運行 ll 命令。
Good Luck
二,
android-ndk-r10e-linux-x86.bin的使用要加上特定代碼即給予執行許可權。
如:chmod +x xxx.bin
sudo ./xxx.bin
加上可執行許可權,然後直接運行。

G. 做Android開發需要裝Linux系統嗎

windows下和linux下都可以開發

但是還是建議裝一個linux系統,如果你只想做Android應用層的開發的話,windows下沒有什麼問題,但是涉及到底層的話,就需要有linux的系統,原因是Android採用的是linux內核,整個系統在windows下沒有辦法編譯。

H. 怎樣解壓android-ndk-r9d-linux-x86

滑鼠右擊解壓

I. 網上說Android NDK r9主要是適用於android4.3,那能否在android4.0上使用

Android NDK R9 主要是為了Android 4.3開發准備的,不適用於4.0開發

閱讀全文

與androidndkr9linux相關的資料

熱點內容
pic單片機學習網站 瀏覽:161
843除6的演算法 瀏覽:374
arduino編程視頻 瀏覽:742
pdf背景綠色 瀏覽:610
記事本dos命令 瀏覽:274
伺服器如何搭建多個節點 瀏覽:326
acx演算法 瀏覽:258
幽冥詭匠漫畫全集用什麼app可以看 瀏覽:1001
租用伺服器為什麼越來越慢 瀏覽:960
演算法創新就業方向 瀏覽:423
演算法最優解作者 瀏覽:868
通達信紅綠寶塔線指標源碼 瀏覽:667
app是什麼東西合法嗎 瀏覽:232
怎麼鎖app視頻教程 瀏覽:841
迅捷pdf注冊碼生成器 瀏覽:750
androidsdkosx 瀏覽:304
壓縮面膜紙熒光 瀏覽:841
app怎麼分身三個 瀏覽:745
電影bt下載源碼 瀏覽:423
iwatch屏幕加密晶元 瀏覽:570