這裡我不想多解釋什麼,對於什麼JNI和NDK的相關內容大家自己去百度或Google.我對Android的學習也只是個新手.廢話少說直接進入正題.
一、在Eclipse中建立一個Android Application Project.相關參數如下:
Application Name : HelloJni; Project Name: HelloJni; Package Name:com.example.hellojni
二、然後我們添加一個Jni類.相關參數如下:
Source folder: HelloJni/src; Package:com.example.hellojni
三、我們在上面所建立的Jni.java中添加兩個方法代碼如下.注意需要加上關鍵字native.
package com.example.hellojni;public class Jni { public native String ShowString(String name); public native int Add(int x,int y);}
四、將Jni.java檔案拷貝到JDK的安裝目錄的BIN目錄下.在WIN7下的路徑是:C:\Program Files\Java\jdk1.7.0\bin.然後開啟控制台進入此目錄執行命令如下.執行成功後會產生Jni.class.
C:\Program Files\Java\jdk1.7.0\bin>javac Jni.java
五、將我們Android工程中src檔案下的com檔案夾拷貝到我們當前所在的目錄.將Jni.class檔案拷貝到com\example\hellojni檔案夾下.可先刪除其它內容.然後執行如下命令.執行成功後會在目前的目錄中產生一個.H檔案:com_example_hellojni_Jni.h
C:\Program Files\Java\jdk1.7.0\bin>javah -jni com.example.hellojni.Jni
六、我們在Android工程中建立一個檔案夾JNI,並將上一步產生的.H檔案拷貝到裡面.然後建立一個與.H對應的.C檔案:com_example_hellojni_Jni.c.添加代碼如下:
#include"com_example_hellojni_Jni.h"JNIEXPORT jstring JNICALL Java_com_example_hellojni_Jni_ShowString(JNIEnv *pJNIEnv, jobject thiz, jstring str){ char * sTempStr = (char *) (*pJNIEnv)->GetStringUTFChars(pJNIEnv,str,0); return (*pJNIEnv)->NewStringUTF(pJNIEnv,sTempStr);}JNIEXPORT jint JNICALL Java_com_example_hellojni_Jni_Add(JNIEnv *pJNIEnv, jobject thiz, jint x, jint y){ return x+y;}
七、我們在工程的JNI檔案夾下建立一個檔案Android.mk.其內容如下:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := HelloJNILOCAL_SRC_FILES := com_example_hellojni_Jni.cinclude $(BUILD_SHARED_LIBRARY)
八、我們在工程的JNI檔案夾的上一級目錄下建立一個檔案Application.mk.其內容如下:
APP_PROJECT_PATH := $(call my-dir)/HelloJniAPP_MOUDLES := HelloJNI
九、將控制台切換到JNI檔案夾所在的目錄.執行命令以產生.SO檔案.執行成功後便可見.SO檔案libs\libHelloJNI.so.
C:\AndroidWorkspace\HelloJni>F:\AndroidNdkR8bWindows\ndk-build.cmd //這個是你的NDK下的工具.
十、然後我們便可以在Android中調用上面的兩個函數代碼如下:
package com.example.hellojni;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity { static { System.loadLibrary("HelloJNI");//對應於libHelloJNI.so.這裡載入時不需要首碼和尾碼 } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Jni jni = new Jni(); TextView textView = new TextView(this); textView.setText(jni.ShowString("兩個數求和結果: ") + Integer.toString(jni.Add(10,20))); setContentView(textView); }}
十一、程式運行結果如下.本Demo:http://t.cn/z8egX2P