ãã1.å¼è¨
ããæä»¬ç¥éï¼Androidç³»ç»çåºå±åºç±c/c++ç¼åï¼ä¸å±Androidåºç¨ç¨åºéè¿Javaèææºè°ç¨åºå±æ¥å£ï¼è¡æ¥åºå±c/c++åºä¸Javaåºç¨ç¨åºé´çæ¥å£æ£æ¯JNIï¼JavaNative Interface)ãæ¬ææè¿°äºå¦ä½å¨ubuntuä¸é
ç½®AndroidJNIçå¼åç¯å¢ï¼ä»¥åå¦ä½ç¼åä¸ä¸ªç®åçc彿°åºåJNIæ¥å£ï¼å¹¶éè¿ç¼åJavaç¨åºè°ç¨è¿äºæ¥å£ï¼æç»è¿è¡å¨æ¨¡æå¨ä¸çè¿ç¨ã
ãã2.ç¯å¢é
ç½®
ãã2.1.å®è£
jdk1.6
ããï¼1ï¼ä»jdk宿¹ç½ç«ä¸è½½jdk-6u29-linux-i586.binæä»¶ã
ããï¼2ï¼æ§è¡jdkå®è£
æä»¶
ãã[html] view plaincopyprint?
ãã01.$chmod a+x jdk-6u29-linux-i586.bin
ãã02.$jdk-6u29-linux-i586.bin
ãã$chmod a+x jdk-6u29-linux-i586.bin
ãã$jdk-6u29-linux-i586.bin
ãã(3)é
ç½®jdkç¯å¢åé
ãã[html] view plaincopyprint?
ãã01.$sudo vim /etc/profile
ãã02.#JAVAEVIRENMENT
ãã03.exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
ãã04.exportJRE_HOME=$JAVA_HOME/jre
ãã05.exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ãã06.exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ãã$sudo vim /etc/profile
ãã#JAVAEVIRENMENT
ããexportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
ããexportJRE_HOME=$JAVA_HOME/jre
ããexportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ããexportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ããä¿ååéåºç¼è¾ï¼å¹¶éå¯ç³»ç»ã
ããï¼4ï¼éªè¯å®è£
ãã[html] view plaincopyprint?
ãã01.$java -version
ãã02.javaversion "1.6.0_29"
ãã03.Java(TM)SE Runtime Environment (build 1.6.0_29-b11)
ãã04.JavaHotSpot(TM) Server VM (build 20.4-b02, mixed mode)
ãã05.$javah
ãã06.ç¨æ³ï¼javah[é项]<ç±»>
ãã07.å
¶ä¸[é项]å
æ¬ï¼
ãã08.-helpè¾åºæ¤å¸®å©æ¶æ¯å¹¶éåº
ãã09.-classpath<è·¯å¾>ç¨äºè£
å
¥ç±»çè·¯å¾
ãã10.-bootclasspath<è·¯å¾>ç¨äºè£
å
¥å¼å¯¼ç±»çè·¯å¾
ãã11.-d<ç®å½>è¾åºç®å½
ãã12.-o<æä»¶>è¾åºæä»¶ï¼åªè½ä½¿ç¨-dæ-oä¸çä¸ä¸ªï¼
ãã13.-jniçæJNIæ ·å¼ç头æä»¶ï¼é»è®¤ï¼
ãã14.-versionè¾åºçæ¬ä¿¡æ¯
ãã15.-verboseå¯ç¨è¯¦ç»è¾åº
ãã16.-forceå§ç»åå
¥è¾åºæä»¶
ãã17.使ç¨å
¨éå®åç§°æå®<ç±»>ï¼ä¾
ãã18.å¦ï¼java.lang.Objectï¼ã
ãã$java -version
ããjavaversion "1.6.0_29"
ããJava(TM)SE Runtime Environment (build 1.6.0_29-b11)
ããJavaHotSpot(TM) Server VM (build 20.4-b02, mixed mode)
ãã$javah
ããç¨æ³ï¼javah[é项]<ç±»>
ããå
¶ä¸[é项]å
æ¬ï¼
ãã-helpè¾åºæ¤å¸®å©æ¶æ¯å¹¶éåº
ãã-classpath<è·¯å¾>ç¨äºè£
å
¥ç±»çè·¯å¾
ãã-bootclasspath<è·¯å¾>ç¨äºè£
å
¥å¼å¯¼ç±»çè·¯å¾
ãã-d<ç®å½>è¾åºç®å½
ãã-o<æä»¶>è¾åºæä»¶ï¼åªè½ä½¿ç¨-dæ-oä¸çä¸ä¸ªï¼
ãã-jniçæJNIæ ·å¼ç头æä»¶ï¼é»è®¤ï¼
ãã-versionè¾åºçæ¬ä¿¡æ¯
ãã-verboseå¯ç¨è¯¦ç»è¾åº
ãã-forceå§ç»åå
¥è¾åºæä»¶
ãã使ç¨å
¨éå®åç§°æå®<ç±»>ï¼ä¾
ããå¦ï¼java.lang.Objectï¼ã2.2.å®è£
androidåºç¨ç¨åºå¼åç¯å¢
ããubuntuä¸å®è£
androidåºç¨ç¨åºå¼åç¯å¢ä¸windows类似ï¼ä¾æ¬¡å®è£
好以ä¸è½¯ä»¶å³å¯ï¼
ããï¼1ï¼Eclipse
ããï¼2ï¼ADT
ããï¼3ï¼AndroidSDK
ããä¸windowsä¸å®è£
å¯ä¸ä¸åçä¸ç¹æ¯ï¼ä¸è½½è¿äºè½¯ä»¶çæ¶åè¦ä¸è½½Linuxçæ¬çå®è£
å
ã
ããå®è£
好以ä¸androidåºç¨ç¨åºçå¼åç¯å¢åï¼è¿å¯ä»¥éæ©æ¯å¦éè¦é
ç½®emulatoråadbå·¥å
·çç¯å¢åéï¼ä»¥æ¹ä¾¿å¨è¿è¡JNIå¼åçæ¶å使ç¨ãé
ç½®æ¥éª¤å¦ä¸ï¼
ããæemulatoræå¨ç®å½android-sdk-linux/tools以åadbæå¨ç®å½android-sdk-linux/platform-toolsæ·»å å°ç¯å¢åéä¸ï¼android-sdk-linuxæandroidsdkå®è£
å
android-sdk_rxx-linuxçè§£åç®å½ã
ãã[plain] view plaincopyprint?
ãã01.$sudo vim /etc/profile
ãã02.exportPATH=~/software/android/android-sdk-linux/tools:$PATH
ãã03. exportPATH=~/software/android/android-sdk-linux/platform-tools:$PATH
ãã$sudo vim /etc/profile
ããexportPATH=~/software/android/android-sdk-linux/tools:$PATH
ããexportPATH=~/software/android/android-sdk-linux/platform-tools:$PATH
ããç¼è¾å®æ¯åéåºï¼å¹¶éå¯çæã
ãã2.3.å®è£
NDK
ããNDKæ¯ç±androidæä¾çç¼è¯androidæ¬å°ä»£ç çä¸ä¸ªå·¥å
·ã
ããï¼1ï¼ä»androidndkå®ç½
http://developer.android.com/sdk/ndk/index.htmlä¸è½½ndkï¼ç®åææ°çæ¬ä¸ºandroid-ndk-r6b-linux-x86.tar.bz2.
ããï¼2ï¼è§£åndkå°å·¥ä½ç®å½ï¼
ãã[plain] view plaincopyprint?
ãã01.$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
ãã02.$sudo mv android-ndk-r6b /usr/local/ndk
ãã$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
ãã$sudo mv android-ndk-r6b /usr/local/ndk
ããï¼3ï¼è®¾ç½®ndkç¯å¢åé
ãã[plain] view plaincopyprint?
ãã01.$sudo vim /etc/profile
ãã02.exportPATH=/usr/local/ndk:$PATH
ãã$sudo vim /etc/profile
ããexportPATH=/usr/local/ndk:$PATH
ããç¼è¾å®æ¯åä¿åéåºï¼å¹¶éå¯çæ
ããï¼4ï¼éªè¯å®è£
ãã[plain] view plaincopyprint?
ãã01.$ cd/usr/local/ndk/samples/hello-jni/
ãã02.$ ndk-build
ãã03.Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
ãã04.Gdbsetup : libs/armeabi/gdb.setup
ãã05.Install : libhello-jni.so => libs/armeabi/libhello-jni.so
ãã$ cd/usr/local/ndk/samples/hello-jni/
ãã$ ndk-build
ããGdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
ããGdbsetup : libs/armeabi/gdb.setup
ããInstall : libhello-jni.so => libs/armeabi/libhello-jni.so
ãã3.JNIå®ç°
ããæä»¬éè¦å®ä¹ä¸ä¸ªç¬¦åJNIæ¥å£è§èçc/c++æ¥å£ï¼è¿ä¸ªæ¥å£ä¸ç¨å¤ªå¤æï¼ä¾å¦è¾åºä¸ä¸ªåç¬¦ä¸²ãæ¥ä¸æ¥ï¼åéè¦æc/c++æ¥å£çä»£ç æä»¶ç¼è¯æå
±äº«åºï¼å¨æåºï¼.soæä»¶ï¼å¹¶æ¾å°æ¨¡æå¨çç¸å
³ç®å½ä¸ãæåï¼å¯å¨Javaåºç¨ç¨åºï¼å°±å¯ä»¥çå°æç»ææäºã
ãã3.1.ç¼åJavaåºç¨ç¨åºä»£ç
ããï¼1ï¼å¯å¨Eclipseï¼æ°å»ºandroidå·¥ç¨
ããProjectï¼JNITest
ããPackageï¼org.tonny.jni
ããActivityï¼JNITest
ããï¼2ï¼ç¼è¾èµæºæä»¶
ããç¼è¾res/values/strings.xmlæä»¶å¦ä¸ï¼
ãã
ããç¼è¾res/layout/main.xmlæä»¶
ããæä»¬å¨ä¸»çé¢ä¸æ·»å äºä¸ä¸ªEditTextæ§ä»¶åä¸ä¸ªButtonæ§ä»¶ã
ããï¼3ï¼ç¼è¾JNITest.javaæä»¶
ã
ããstatic表示å¨ç³»ç»ç¬¬ä¸æ¬¡å è½½ç±»çæ¶åï¼å
æ§è¡è¿ä¸æ®µä»£ç ï¼å¨è¿é表示å è½½å¨æåºlibJNITest.soæä»¶ã
ããåçè¿ä¸æ®µï¼
ãã[java] view plaincopyprint?
ãã01.privatenativeString GetReply();
ããprivatenativeString GetReply();
ããnative表示è¿ä¸ªæ¹æ³ç±æ¬å°ä»£ç å®ä¹ï¼éè¦éè¿jniæ¥å£è°ç¨æ¬å°c/c++代ç ã
ãã[java] view plaincopyprint?
ãã01.publicvoidonClick(View arg0) {
ãã02.edtName.setText(reply);
ãã03.}
ããpublicvoidonClick(View arg0) {
ããedtName.setText(reply);
ãã}
ããè¿æ®µä»£ç 表示ç¹å»æé®åï¼ænativeæ¹æ³çè¿åçå符串æ¾ç¤ºå°EditTextæ§ä»¶ã
ããï¼4ï¼ç¼è¯å·¥ç¨ï¼çæ.classæä»¶ã
ãã3.2.ç¨javahå·¥å
·çæç¬¦åJNIè§èçcè¯è¨å¤´æä»¶
ããå¨ç»ç«¯ä¸ï¼è¿å
¥androidå·¥ç¨æå¨çbinç®å½
ãã[plain] view plaincopyprint?
ãã01.$cd ~/project/Android/JNITest/bin
ãã$cd ~/project/Android/JNITest/bin
ããæä»¬ç¨lså½ä»¤æ¥çï¼å¯ä»¥çå°binç®å½ä¸æä¸ªclassesç®å½ï¼å
¶ç®å½ç»æä¸ºclasses/org/tonny/jniï¼å³classesçåç®å½ç»ææ¯androidå·¥ç¨çå
åorg.tonny.jniã请注æï¼ä¸é¢æä»¬å夿§è¡javahå½ä»¤çæ¶åï¼å¿
é¡»è¿å
¥å°org/tonny/jniçä¸çº§ç®å½ï¼å³classesç®å½ï¼å¦åjavahä¼æç¤ºæ¾ä¸å°ç¸å
³çjavaç±»ã
ããä¸é¢ç»§ç»ï¼
ãã[plain] view plaincopyprint?
ãã01.$cd classes
ãã02.$javah org.tonny.jni.JNITest
ãã03.$ls
ãã04.org org_tonny_jni_JNITest.h
ãã$cd classes
ãã$javah org.tonny.jni.JNITest
ãã$ls
ããorg org_tonny_jni_JNITest.h
ããæ§è¡javahorg.tonny.jni.JNITestå½ä»¤ï¼å¨classesç®å½ä¸ä¼çæorg_tonny_jni_JNITest.h头æä»¶ã妿ä¸è¿å
¥å°classesç®å½ä¸çè¯ï¼ä¹å¯ä»¥è¿æ ·ï¼
ãã[plain] view plaincopyprint?
ãã01.$javah -classpath ~/project/Android/JNITest/bin/classesorg.tonny.jni.JNITest
ãã$javah -classpath ~/project/Android/JNITest/bin/classesorg.tonny.jni.JNITest
ãã-classpath åæ°è¡¨ç¤ºè£
载类çç®å½ã
ãã3.3.ç¼åc/c++代ç
ããçæorg_tonny_jni_JNITest.h头æä»¶åï¼æä»¬å°±å¯ä»¥ç¼åç¸åºç彿°ä»£ç äºãä¸é¢å¨androidå·¥ç¨ç®å½ä¸æ°å»ºjniç®å½ï¼å³~/project/Android/JNITest/jniï¼æorg_tonny_jni_JNITest.h头æä»¶æ·è´å°jniç®å½ä¸ï¼å¹¶å¨jniç®å½ä¸æ°å»ºorg_tonny_jni_JNITest.cæä»¶ï¼ç¼è¾ä»£ç å¦ä¸ï¼
ãã[cpp] view plaincopyprint?
ãã01.#include<jni.h>
ãã02.#include<string.h>
ãã03.#include"org_tonny_jni_JNITest.h"
ãã04.
ãã05.
ãã06.JNIEXPORTjstring JNICALLJava_org_tonny_jni_JNITest_GetReply
ãã07.(JNIEnv *env, jobject obj){
ãã08.return(*env)->NewStringUTF(env,(char*)"Hello,JNITest");
ãã09.}
ãã#include<jni.h>
ãã#include<string.h>
ãã#include"org_tonny_jni_JNITest.h"
ããJNIEXPORTjstring JNICALLJava_org_tonny_jni_JNITest_GetReply
ãã(JNIEnv *env, jobject obj){
ããreturn(*env)->NewStringUTF(env,(char*)"Hello,JNITest");
ãã}
ããæä»¬å¯ä»¥çå°ï¼è¯¥å½æ°çå®ç°ç¸å½ç®åï¼è¿åä¸ä¸ªå符串为ï¼"Hello,JNITest"
ãã3.4.ç¼åAndroid.mkæä»¶
ããå¨~/project/Android/JNITest/jniç®å½ä¸æ°å»ºAndroid.mkæä»¶ï¼androidå¯ä»¥æ ¹æ®è¿ä¸ªæä»¶çç¼è¯åæ°ç¼è¯æ¨¡åãç¼è¾Android.mkæä»¶å¦ä¸ï¼
ãã[plain] view plaincopyprint?
ãã01.LOCAL_PATH:= $(call my-dir)
ãã02.include$(CLEAR_VARS)
ãã03.LOCAL_MODULE := libJNITest
ãã04.LOCAL_SRC_FILES:= org_tonny_jni_JNITest.c
ãã05.include$(BUILD_SHARED_LIBRARY)
ããLOCAL_PATH:= $(call my-dir)
ããinclude$(CLEAR_VARS)
ããLOCAL_MODULE := libJNITest
ããLOCAL_SRC_FILES:= org_tonny_jni_JNITest.c
ããinclude$(BUILD_SHARED_LIBRARY)
ããLOCAL_MODULE表示ç¼è¯ç卿åºåç§°
ããLOCAL_SRC_FILES 表示æºä»£ç æä»¶
ãã3.5.ç¨ndkå·¥å
·ç¼è¯å¹¶çæ.soæä»¶
ããè¿å
¥å°JNITestçå·¥ç¨ç®å½ï¼æ§è¡ndk-buildå½ä»¤å³å¯çælibJNITest.soæä»¶ã
ãã[plain] view plaincopyprint?
ãã01.$cd ~/project/Android/JNITest/
ãã02.$ndk-build
ãã03.Invalidattribute name:
ãã04.package
ãã05.Install : libJNITest.so => libs/armeabi/libJNITest.so
ãã$cd ~/project/Android/JNITest/
ãã$ndk-build
ããInvalidattribute name:
ããpackage
ããInstall : libJNITest.so => libs/armeabi/libJNITest.so
ããå¯ä»¥çå°ï¼å¨å·¥ç¨ç®å½çlibs/armeabiç®å½ä¸çæäºlibJNITest.soæä»¶ã
ãã3.6.卿¨¡æå¨ä¸è¿è¡
ããï¼1ï¼é¦å
ï¼æä»¬æandroid模æå¨å¯å¨èµ·æ¥ãè¿å
¥å°emulatoræå¨ç®å½ï¼æ§è¡emulatorå½ä»¤ï¼
ãã[plain] view plaincopyprint?
ãã01.$cd ~/software/android/android-sdk-linux/tools
ãã02.$./emulator @AVD-2.3.3-V10 -partition-size 512
ãã$cd ~/software/android/android-sdk-linux/tools
ãã$./emulator @AVD-2.3.3-V10 -partition-size 512
ããAVD-2.3.3-V10è¡¨ç¤ºä½ çæ¨¡æå¨åç§°ï¼ä¸å¨Eclipse->AVDManagerä¸çAVDName对åºï¼-partition-size表示模æå¨çåå¨è®¾å¤å®¹éã
ããï¼2ï¼æ¥ä¸æ¥ï¼æä»¬éè¦ælibJNITest.soæä»¶æ·è´å°æ¨¡æå¨ç/system/libç®å½ä¸ï¼æ§è¡ä»¥ä¸å½ä»¤ï¼
ãã[plain] view plaincopyprint?
ãã01.$cd ~/project/Android/JNITest/libs/armeabi/
ãã02.$adb remount
ãã03.$adb push libJNITest.so /system/lib
ãã04.80 KB/s (10084 bytes in 0.121s)
ãã$cd ~/project/Android/JNITest/libs/armeabi/
ãã$adb remount
ãã$adb push libJNITest.so /system/lib
ãã80 KB/s (10084 bytes in 0.121s)
ããå½å¨ç»ç«¯ä¸çå°æ80 KB/s (10084 bytes in 0.121s)ä¼ è¾é度çä¿¡æ¯çæ¶åï¼è¯´ææ·è´æåã
ããï¼3ï¼å¨ç»ç«¯ä¸æ§è¡JNITestç¨åºï¼è¿ä¸ªæä»¬å¯ä»¥å¨Eclipseä¸ï¼å³é®ç¹å»JNITestå·¥ç¨ï¼RunAs->Android Applicationï¼å³å¯å¨æ¨¡æå¨ä¸å¯å¨ç¨åº