ããAndroid NDK æ¯å¨SDKåé¢åå ä¸äºâåçâäºåï¼å³Native Development Kitï¼å æ¤å被Google称为âNDKâãä¼æå¨ç¥ï¼Androidç¨åºè¿è¡å¨Dalvikèææºä¸ï¼NDKå
许ç¨æ·ä½¿ç¨ç±»ä¼¼C / C++ä¹ç±»çåç代ç è¯è¨æ§è¡é¨åç¨åºãNDKå
æ¬äºï¼
ããä»C / C++çæåç代ç åºæéè¦çå·¥å
·åbuild filesã
ããå°ä¸è´çåçåºåµå
¥å¯ä»¥å¨Android设å¤ä¸é¨ç½²çåºç¨ç¨åºå
æ件ï¼application packages filesï¼å³.apkæ件ï¼ä¸ã
ããæ¯ææææªæ¥Androidå¹³å°çä¸äºååçç³»ç»å¤´æ件ååº
ãã为ä½è¦ç¨å°NDKï¼æ¦æ¬æ¥è¯´ä¸»è¦å为以ä¸å ç§æ
åµï¼
ãã代ç çä¿æ¤ï¼ç±äºapkçjavaå±ä»£ç å¾å®¹æ被åç¼è¯ï¼èC/C++åºåæ±é¾åº¦è¾å¤§ã
ããå¨NDKä¸è°ç¨ç¬¬ä¸æ¹C/C++åºï¼å 为大é¨åçå¼æºåºé½æ¯ç¨C/C++代ç ç¼åçã
ãã便äºç§»æ¤ï¼ç¨C/C++åçåºå¯ä»¥æ¹ä¾¿å¨å
¶ä»çåµå
¥å¼å¹³å°ä¸å次使ç¨ã
ããAndroid JNIæ¯ä»ä¹ï¼åNDKæ¯ä»ä¹å
³ç³»ï¼
ããJava Native Interface(JNI)æ åæ¯javaå¹³å°çä¸é¨åï¼å®å
许Java代ç åå
¶ä»è¯è¨åç代ç è¿è¡äº¤äºãJNIæ¯æ¬å°ç¼ç¨æ¥å£ï¼å®ä½¿å¾å¨ Java èææº(VM) å
é¨è¿è¡ç Java 代ç è½å¤ä¸ç¨å
¶å®ç¼ç¨è¯è¨(å¦ CãC++åæ±ç¼è¯è¨)ç¼åçåºç¨ç¨åºååºè¿è¡äº¤äºæä½ã
ããç®åæ¥è¯´ï¼å¯ä»¥è®¤ä¸ºNDKå°±æ¯è½å¤æ¹ä¾¿å¿«æ·å¼å.soæ件çå·¥å
·ãJNIçè¿ç¨æ¯è¾å¤æï¼çæ.soéè¦å¤§éæä½ï¼èNDKå°±æ¯ç®åäºè¿ä¸ªè¿ç¨ã
ããNDKçå¼å¸¸ä¼ä¸ä¼å¯¼è´ç¨åºCrashï¼NDKç常è§çæåªäºç±»åå¼å¸¸ï¼
ããNDKç¼è¯çæç.soæ件ä½ä¸ºç¨åºçä¸é¨åï¼å¨è¿è¡åçå¼å¸¸æ¶åæ ·ä¼é æç¨åºå´©æºãä¸åäºJava代ç å¼å¸¸é æçç¨åºå´©æºï¼å¨NDKçå¼å¸¸åçæ¶ï¼ç¨åºå¨Android设å¤ä¸é½ä¼ç«å³éåºï¼å³é常æ说çéªéï¼èä¸ä¼å¼¹åºâç¨åºxxxæ ååºï¼æ¯å¦ç«å³å
³éâä¹ç±»çæ示æ¡ã
ããNDKæ¯ä½¿ç¨C/C++æ¥è¿è¡å¼åçï¼çæC/C++çç¨åºåé½ç¥éï¼æéåå
å管çæ¯æéè¦ä¹æ¯æ容æåºé®é¢çå°æ¹ï¼ç¨æä¸æ
å°±ä¼éå°è¯¸å¦å
åæ æ访é®ãæ æ对象ãå
åæ³é²ãå æ 溢åºç常è§çé®é¢ï¼æåé½æ¯åä¸ä¸ªç»æï¼ç¨åºå´©æºãä¾å¦æ们常说ç空æéé误ï¼å°±æ¯å½ä¸ä¸ªå
åæé被置为空ï¼NULLï¼ä¹åå次对å
¶è¿è¡è®¿é®ï¼å¦å¤ä¸ä¸ªç»å¸¸åºç°çé误æ¯ï¼å¨ç¨åºçæ个ä½ç½®éæ¾äºæ个å
å空é´ï¼èåå¨ç¨åºçå
¶ä»ä½ç½®è¯å¾è®¿é®è¯¥å
åå°åï¼è¿å°±ä¼äº§çä¸ä¸ªæ æå°åé误ã常è§çé误类åå¦ä¸ï¼
ããåå§åé误
ãã访é®é误
ããæ°ç»ç´¢å¼è®¿é®è¶ç
ããæé对象访é®è¶ç
ãã访é®ç©ºæé对象
ãã访é®æ ææé对象
ããè¿ä»£å¨è®¿é®è¶ç
ããå
åæ³é²
ããåæ°é误
ããå æ 溢åº
ããç±»å转æ¢é误
ããæ°åé¤0é误
ããNDKé误åçæ¶ï¼æ们è½æ¿å°ä»ä¹ä¿¡æ¯ï¼
ããå©ç¨Android NDKå¼åæ¬å°åºç¨çæ¶åï¼å ä¹ææçç¨åºåé½éå°è¿ç¨åºå´©æºçé®é¢ï¼ä½å®çå´©æºä¼å¨logcatä¸æå°ä¸å çèµ·æ¥ç±»ä¼¼å¤©ä¹¦çå æ ä¿¡æ¯ï¼è®©äººä¸¾è¶³æ æªãåé æ·»å ä¸è¡è¡çæå°ä¿¡æ¯æ¥å®ä½é误代ç åå¨çè¡æ°ï¼æ çæ¯ä¸ä»¶ä»¤äººå´©æºçäºæ
ãå¨ç½ä¸æç´¢âAndroid NDKå´©æºâï¼å¯ä»¥æç´¢å°å¾å¤æç« æ¥ä»ç»å¦ä½éè¿Androidæä¾çå·¥å
·æ¥æ¥æ¾åå®ä½NDKçé误ï¼ä½å¤§é½æ¦æ¶©é¾æãä¸é¢ä»¥ä¸ä¸ªå®é
çä¾åæ¥è¯´æï¼é¦å
çæä¸ä¸ªé误ï¼ç¶åæ¼ç¤ºå¦ä½éè¿ä¸¤ç§ä¸åçæ¹æ³ï¼æ¥å®ä½é误çå½æ°åå代ç è¡ã
ããé¦å
ï¼çæ们å¨hello-jniç¨åºç代ç ä¸åäºä»ä¹ï¼æå
³å¦ä½å建æ导å
¥å·¥ç¨ï¼æ¤å¤ç¥ï¼ï¼çä¸å¾ï¼å¨JNI_OnLoad()çå½æ°ä¸ï¼å³soå è½½æ¶ï¼è°ç¨willCrash()å½æ°ï¼èå¨willCrash()å½æ°ä¸ï¼ std::stringçè¿ç§èµå¼æ¹æ³ä¼äº§çä¸ä¸ªç©ºæéé误ãè¿æ ·ï¼å¨hello-jniç¨åºå è½½æ¶å°±ä¼éªéãæ们记ä¸ä¸è¿ä¸¤ä¸ªè¡æ°ï¼å¨61è¡è°ç¨äºwillCrash()å½æ°ï¼å¨69è¡åçäºå´©æºã
ããå¦æä½ çè¿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 copy
ããadb shell logcat | ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
ããå½å´©æºåçæ¶ï¼ä¼å¾å°å¦ä¸çä¿¡æ¯ï¼
ãã[plain] view
ããplain copy
ãã********** Crash dump: **********
ããBuild fingerprint: '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 <<<
ããsignal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
ããStack frame #00 pc 00023438 /system/lib/libc.so (strlen+72)
ããStack frame #01 pc 00004de8 /data/app-lib/com.example.hellojni-2/libhello-jni.so (std::char_traits<char>::length(char const*)+20): Routine std::char_traits<char>::length(char const*) at /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/char_traits.h:229
ããStack frame #02 pc 000056c8 /data/app-lib/com.example.hellojni-2/libhello-jni.so (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)+44): Routine basic_string at /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/_string.c:639
ããStack frame #03 pc 00004fb4 /data/app-lib/com.example.hellojni-2/libhello-jni.so (willCrash()+68): Routine willCrash() at /home/testin/hello-jni/jni/hello-jni.cpp:69
ããStack frame #04 pc 00004f58 /data/app-lib/com.example.hellojni-2/libhello-jni.so (JNI_OnLoad+20): Routine JNI_OnLoad at /home/testin/hello-jni/jni/hello-jni.cpp:61
ããStack frame #05 pc 000505b9 /system/lib/libdvm.so (dvmLoadNativeCode(char const*, Object*, char**)+516)
ããStack frame #06 pc 00068005 /system/lib/libdvm.so
ããStack frame #07 pc 000278a0 /system/lib/libdvm.so
ããStack frame #08 pc 0002b7fc /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
ããStack frame #09 pc 00060fe1 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
ããâ¦â¦ï¼åé¢ç¥ï¼
ããæ们éç¹çä¸ä¸#03å#04ï¼è¿ä¸¤è¡é½æ¯å¨æ们èªå·±çæçlibhello-jni.soä¸çæ¥éä¿¡æ¯ï¼é£ä¹ä¼åç°å¦ä¸å
³é®ä¿¡æ¯ï¼
ãã[plain] view
ããplain copy
ãã#03 (willCrash()+68): Routine willCrash() at /home/testin/hello-jni/jni/hello-jni.cpp:69
ãã#04 (JNI_OnLoad+20): Routine JNI_OnLoad at /home/testin/hello-jni/jni/hello-jni.cpp:61
ããåæ³ä¸ä¸æ们ç代ç ï¼å¨JNI_OnLoad()å½æ°ä¸ï¼ç¬¬61è¡ï¼ï¼æ们è°ç¨äºwillCrash()å½æ°ï¼å¨willCrash()å½æ°ä¸ï¼ç¬¬69è¡ï¼ï¼æ们å¶é äºä¸ä¸ªé误ãè¿äºä¿¡æ¯é½è¢«åç¡®æ 误çæåäºåºæ¥ï¼æ¯ä¸æ¯é常ç®åï¼
ããå
è·åæ¥å¿ï¼å使ç¨ndk-stackåæ
ããè¿ç§æ¹æ³å
¶å®åä¸é¢çæ¹æ³æ²¡æä»ä¹å¤§çåºå«ï¼ä»
ä»
æ¯logcatæ¥å¿è·åçæ¹å¼ä¸åãå¯ä»¥å¨ç¨åºè¿è¡çè¿ç¨ä¸å°logcatæ¥å¿ä¿åå°ä¸ä¸ªæ件ï¼çè³å¯ä»¥å¨å´©æºåçæ¶ï¼å¿«éçå°logcatæ¥å¿ä¿åèµ·æ¥ï¼ç¶ååè¿è¡åæï¼æ¯ä¸é¢çæ¹æ³ç¨å¾®çµæ´»ä¸ç¹ï¼èä¸æ¥å¿å¯ä»¥çå¾
以å继ç»åæã
ãã[plain] view
ããplain copy
ããadb shell logcat > 1.log
ããndk-stack -sym $PROJECT_PATH/obj/local/armeabi âdump 1.log
ãã第äºç§æ¹æ³ï¼ä½¿ç¨addr2lineåobjdumpå½ä»¤
ããè¿ä¸ªæ¹æ³éç¨äºé£äºï¼ä¸æ»¡è¶³äºä¸è¿°ndk-stackçç®åç¨æ³ï¼èå欢å¨æ ¹é®åºçç¨åºå们ï¼è¿ä¸¤ä¸ªæ¹æ³å¯ä»¥æ示ndk-stackå½ä»¤çå·¥ä½åçæ¯ä»ä¹ï¼å°½ç®¡ç¨èµ·æ¥ç¨å¾®éº»ç¦ä¸ç¹ï¼ä½æ¯å¯ä»¥æ»¡è¶³ä¸ä¸ç¨åºåç好å¥å¿ã
ããå
ç®å说ä¸ä¸è¿ä¸¤ä¸ªå½ä»¤ï¼å¨ç»å¤§é¨åçlinuxåè¡çæ¬ä¸é½è½æ¾å°ä»ä»¬ï¼å¦æä½ çæä½ç³»ç»æ¯linuxï¼èä½ æµè¯ææºä½¿ç¨çæ¯Intel
ããx86ç³»åï¼é£ä¹ä½ 使ç¨ç³»ç»ä¸èªå¸¦çå½ä»¤å°±å¯ä»¥äºãç¶èï¼å¦æä»
ä»
æ¯è¿æ ·ï¼é£ä¹ç»å¤§å¤æ°äººè¦ç»æäºï¼å 为æ°æ°å¤§é¨åå¼åè
使ç¨çæ¯Windowsï¼èææºå¾æå¯è½æ¯armeabiç³»åã
ããå«æ¥ï¼å¨NDKä¸èªå¸¦äºéç¨äºå个æä½ç³»ç»åCPUæ¶æçå·¥å
·é¾ï¼å
¶ä¸å°±å
å«äºè¿ä¸¤ä¸ªå½ä»¤ï¼åªä¸è¿ååç¨æååï¼ä½ å¯ä»¥å¨NDKç®å½çtoolchainsç®å½ä¸æ¾å°ä»ä»¬ã以æçMacçµè为ä¾ï¼å¦ææè¦æ¾çæ¯éç¨äºarmeabiæ¶æçå·¥å
·ï¼é£ä¹ä»ä»¬åå«ä¸ºarm-linux-androideabi-addr2lineåarm-linux-androideabi-objdumpï¼ä½ç½®å¨ä¸é¢ç®å½ä¸ï¼åç»ä»ç»ä¸å°çç¥æ¤ä½ç½®ï¼
ãã[plain] view
ããplain copy
ãã/Developer/android_sdk/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/
ããåè®¾ä½ ççµèæ¯windowsï¼ CPUæ¶æ为mipsï¼é£ä¹ä½ è¦çå·¥å
·å¯è½å
å«å¨è¿ä¸ªç®å½ä¸ï¼
ãã[plain] view
ããplain copy
ããD:\ android-ndk-r9d\toolchains\mipsel-linux-android-4.8\prebuilt\windows-x86_64\bin\
ãã好äºè¨å½æ£ä¼ ï¼å¦ä½ä½¿ç¨è¿ä¸¤ä¸ªå·¥å
·ï¼ä¸é¢å
·ä½ä»ç»ï¼
ãã1. æ¾å°æ¥å¿ä¸çå
³é®å½æ°æé
ããå
¶å®å¾ç®åï¼å°±æ¯æ¾å°backtraceä¿¡æ¯ä¸ï¼å±äºæ们èªå·±çsoæ件æ¥éçè¡ã
ããé¦å
è¦æ¾å°backtraceä¿¡æ¯ï¼æçææºä¼æç¡®æå°ä¸è¡backtraceï¼æ¯å¦æ们è¿æ¬¡ä½¿ç¨çææºï¼ï¼é£ä¹è¿ä¸è¡ä¸é¢çä¸ç³»å以â#两ä½æ°å pcâå¼å¤´çè¡å°±æ¯backtraceä¿¡æ¯äºãææ¶å¯è½æçææºå¹¶ä¸ä¼æå°ä¸è¡backtraceï¼é£ä¹åªè¦æ¾å°ä¸æ®µä»¥â#两ä½æ°å pc âå¼å¤´çè¡ï¼å°±å¯ä»¥äºã
ããå
¶æ¬¡è¦æ¾å°å±äºèªå·±çsoæ件æ¥éçè¡ï¼è¿å°±æ¯è¾ç®åäºãæ¾å°è¿äºè¡ä¹åï¼è®°ä¸è¿äºè¡ä¸çå½æ°å°å
ãã2. 使ç¨addr2lineæ¥æ¾ä»£ç ä½ç½®
ããæ§è¡å¦ä¸çå½ä»¤ï¼å¤ä¸ªæéå°åå¯ä»¥å¨ä¸ä¸ªå½ä»¤ä¸å¸¦å
¥ï¼ä»¥ç©ºæ ¼éå¼å³å¯
ãã[plain] view
ããplain copy
ããarm-linux-androideabi-addr2line âe obj/local/armeabi/libhello-jni.so 00004de8 000056c8 00004fb4 00004f58
ããç»æå¦ä¸
ãã[plain] view
ããplain copy
ãã/android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/char_traits.h:229
ãã/android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/_string.c:639
ãã/WordSpaces/hello-jni/jni/hello-jni.cpp:69
ãã/WordSpaces hello-jni/jni/hello-jni.cpp:6
ããä»addr2lineçç»æå°±è½çå°ï¼æ们æ¿å°äºæ们èªå·±çé误代ç çè°ç¨å
³ç³»åè¡æ°ï¼å¨hello-jni.cppç69è¡å61è¡ï¼å¦å¤ä¸¤è¡å 为使ç¨çæ¯æ åå½æ°ï¼å¯ä»¥å¿½ç¥æï¼ï¼ç»æåndk-stackæ¯ä¸è´çï¼è¯´ændk-stackä¹æ¯éè¿addr2lineæ¥è·å代ç ä½ç½®çã
ãã3. 使ç¨objdumpè·åå½æ°ä¿¡æ¯
ããéè¿addr2lineå½ä»¤ï¼å
¶å®æ们已ç»æ¾å°äºæ们代ç ä¸åºéçä½ç½®ï¼å·²ç»å¯ä»¥å¸®å©ç¨åºåå®ä½é®é¢æå¨äºãä½æ¯ï¼è¿ä¸ªæ¹æ³åªè½è·å代ç è¡æ°ï¼å¹¶æ²¡ææ¾ç¤ºå½æ°ä¿¡æ¯ï¼æ¾å¾ä¸é£ä¹âå®ç¾âï¼å¯¹äºè¿½æ±æè´çç¨åºåæ¥è¯´ï¼è¿å½ç¶æ¯ä¸å¤çãä¸é¢æ们就æ¼ç¤ºæä¹æ¥å®ä½å½æ°ä¿¡æ¯ã
ãã使ç¨å¦ä¸å½ä»¤å¯¼åºå½æ°è¡¨ï¼
ãã[plain] view
ããplain copy
ããarm-linux-androideabi-objdump âS obj/local/armeabi/libhello-jni.so > hello.asm
ããå¨çæçasmæ件ä¸æ¥æ¾ååæ们å®ä½ç两个å
³é®æé00004fb4å00004f58
ããä»è¿ä¸¤å¼ å¾å¯ä»¥æ¸
æ¥ççå°ï¼è¦æ³¨æçæ¯ï¼å¨ä¸åçNDKçæ¬åä¸åçæä½ç³»ç»ä¸ï¼asmæ件çæ ¼å¼ä¸æ¯å®å
¨ç¸åï¼ä½é½å¤§åå°å¼ï¼è¯·å¤§å®¶ä»ç»æ¯å¯¹ï¼ï¼è¿ä¸¤ä¸ªæéåå«å±äºwillCrash()åJNI_OnLoad()å½æ°ï¼åç»ååæaddr2lineçç»æï¼é£ä¹è¿ä¸¤ä¸ªå°ååå«å¯¹åºçä¿¡æ¯å°±æ¯ï¼
ãã[plain] view
ããplain copy
ãã00004fb4: willCrash() /WordSpaces/hello-jni/jni/hello-jni.cpp:69
ãã00004f58: JNI_OnLoad()/WordSpaces/hello-jni/jni/hello-jni.cpp:61
ããç¸å½å®ç¾ï¼åndk-stackå¾å°çä¿¡æ¯å®å
¨ä¸è´ï¼
ãã使ç¨Testinå´©æºåææå¡å®ä½NDKé误
ãã以ä¸æå°çæ¹æ³ï¼åªéåå¨å¼åæµè¯æé´ï¼å¦æä½ çåºç¨æè
游æå·²ç»åå¸ä¸çº¿ï¼èç¨æ·ç»å¸¸åé¦è¯´å´©æºãéªéï¼ææç¨æ·å¸®ä½ æ¶éä¿¡æ¯å®ä½é®é¢ï¼å ä¹æ¯ä¸å¯è½çãè¿ä¸ªæ¶åï¼æ们就éè¦ç¨å
¶ä»çæ段æ¥æè·å´©æºä¿¡æ¯ã
ããç®åä¸çå·²ç»æä¸äºå
¬å¸æ¨åºäºå´©æºä¿¡æ¯æ¶éçæå¡ï¼éè¿åµå
¥SDKï¼å¨ç¨åºåçå´©æºæ¶æ¶éå æ ä¿¡æ¯ï¼åéå°äºæå¡å¹³å°ï¼ä»è帮å©å¼åè
å®ä½é误信æ¯ãå¨è¿æ¹é¢ï¼å¤äºé¢å
å°ä½çæ¯å½å
çTestinåå½å¤çcrittercismï¼å
¶ä¸crittercisméè¦ä»è´¹ï¼èä¸æ²¡æä¸é¨çä¸å½å¼åè
æ¯æï¼æ们æ´æ¨èTestinï¼å
¶å´©æºåææå¡æ¯å®å
¨å
è´¹çã
ããTestinä»1.4çæ¬å¼å§æ¯æNDKçå´©æºåæï¼å
¶ææ°çæ¬å·²ç»å级å°1.7ãå½ç¨åºåçNDKé误æ¶ï¼å
¶å
åµçSDKä¼æ¶éç¨åºå¨ç¨æ·ææºä¸åçå´©æºæ¶çå æ ä¿¡æ¯ï¼ä¸»è¦å°±æ¯ä¸é¢æ们éè¿logcatæ¥å¿è·åå°çå½æ°æéï¼ã设å¤ä¿¡æ¯ã线ç¨ä¿¡æ¯ççï¼SDKå°è¿äºä¿¡æ¯ä¸æ¥è³Testinäºæå¡å¹³å°ï¼åªè¦ç»éå°Testinå¹³å°ï¼å°±å¯ä»¥çå°ææç¨æ·ä¸æ¥çå´©æºä¿¡æ¯ï¼å
æ¬NDKï¼å¹¶ä¸è¿äºå´©æºåè¿å½ä¸åçå¤çï¼å¨ä¸åç³»ç»åROMççæ¬ä¸æå°çä¿¡æ¯ä¼ç¥æä¸åï¼ä½æ¯å¨Testinçç½ç«ä¸è¿äºé½åäºå¾å¥½çå¤çï¼é¿å
äºæ们ä¸äºéå¤å³å¨ã
ããä¸å¾ç红æ¡é¨åï¼å°±æ¯ä»ç¨æ·ææºä¸æ¥çï¼æ们èªå·±çsoä¸æ¥éçå½æ°æéå°åå æ ä¿¡æ¯ï¼å°±åæ们å¼åæ¶ä»logcat读å°çæ¥å¿ä¸æ ·ï¼æ¯ä¸äºæ¦æ¶©é¾æçæéå°åï¼Testin为NDKå´©æºæä¾äºç¬¦å·åçåè½ï¼åªè¦å°æ们ç¼è¯è¿ç¨ä¸äº§ççå
å«ç¬¦å·è¡¨çsoæ件ä¸ä¼ ï¼ä¸ææ们æå°è¿çobj/local/ç®å½ä¸çéç¨äºå个CPUæ¶æçsoï¼ï¼å°±å¯ä»¥èªå¨å°å½æ°æéå°åå®ä½å°å½æ°å称å代ç è¡æ°ã符å·åä¹åï¼çèµ·æ¥å°±åæ们åé¢å¨æ¬å°æµè¯çç»ææ¯ä¸æ ·çäºï¼ä¸ç®äºç¶ã
ããèä¸ä½¿ç¨è¿ä¸ªåè½è¿æä¸ä¸ªå¥½å¤ï¼è¿äºå
å«ç¬¦å·è¡¨çsoæ件ï¼å¨æ¯æ¬¡æ们èªå·±ç¼è¯ä¹åé½ä¼æ¹åï¼å¾æå¯è½æ们åååå¸ä¸ä¸ªæ°çæ¬ï¼è¿äºç®å½ä¸çso就已ç»åäºï¼å 为å¼åè
ä¼ç¨åºçä¿®æ¹ç¨åºï¼å¨è¿æ ·çæ
åµä¸ï¼å³ä½¿æ们æ¿å°äºå´©æºæ¶çå æ ä¿¡æ¯ï¼é£ä¹æ æ³åè¿è¡ç¬¦å·åäºãæ以æ们å¨ç¼è¯æå
å®æåè®°å¾å¤ä»½æ们çsoæ件ãè¿æ¶æ们å¯ä»¥å°è¿äºæ件ä¸ä¼ å°Testinè¿è¡ç¬¦å·åçå·¥ä½ï¼Testinä¼ä¸ºæ们ä¿åå管çä¸åçæ¬çsoæ件ï¼ç¡®ä¿ä¿¡æ¯ä¸ä¼ä¸¢å¤±ã
温馨提示:答案为网友推荐,仅供参考