Android_Jni學習總結
Android中jni的實現方法
1.編寫我們的android的java源碼
(1)創建一個android工程
(2)加載動態鏈接庫
(3)申明native方法
代碼如下:
package explorer.jniTest01;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class JniTest01extends Activity {
/*加載動態鏈接庫*/
static {
System.loadLibrary("hello");
}
/*申明natvie方法*/
public native int add(int a,int b);
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView)findViewById(R.id.add);
/*驗證native方法*/
textView.setText("add ="+add(3,6));
}
}
2.在eclipse中編譯我們的android工程
3.調用javah這個工具生成explorer_jniTest01_JniTest01.h文件
(1)首先進入到工程的bin文件目錄
(2)執行javah工具(包含在工程文件下創建jni文件目錄)
代碼如下:
cd /root/Desktop/android_jni/jniTest01/bin
javah -d /root/Desktop/android_jni/jniTest01/jni/ -classpath . explorer.jniTest01.JniTest01
這裏說明一下-classpath後面的“.”前後都有空格,“.”後面的文件格式爲包名.類名
我們還是先看看這個.h文件的內容吧
代碼如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include<jni.h>
/* Header for class explorer_jniTest01_JniTest01 */
#ifndef _Included_explorer_jniTest01_JniTest01
#define _Included_explorer_jniTest01_JniTest01
#ifdef __cplusplus
extern"C" {
#endif
/*
* Class: explorer_jniTest01_JniTest01
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALLJava_explorer_jniTest01_JniTest01_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
這裏不在解釋了,在JAVA_JNI中以講解過
4更具explorer_jniTest01_JniTest01.h文件編寫.c文件
(1)加載需要的頭文件
(2)實現native方法
代碼如下:
#include<jni.h>
#include"explorer_jniTest01_JniTest01.h"
JNIEXPORT jint
JNICALL Java_explorer_jniTest01_JniTest01_add(JNIEnv *env, jclass c, jint a, jint b)
{
return (a+b);
}
5.創建一個Android.mk的工程管理文件
代碼如下:
LOCAL_PATH:= $(call my-dir)
include$(CLEAR_VARS)
LOCAL_SRC_FILES:= hello.c
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_MODULE := libhello
include$(BUILD_SHARED_LIBRARY)
好吧這裏以此來說下他們有什麼用吧
LOCAL_PATH:= $(call my-dir)表示在開發樹中查找源文件,這裏的宏函數my-dir由編譯系統提供,返回當前路徑
include$(CLEAR_VARS)這裏的 CLEAR_VARS由編譯系統提供,表示清除LOCAL_XX變量(除了LOCAL_PATH)
LOCAL_SRC_FILES:= hello.c這裏我們需要修改成我們自己的.c文件
LOCAL_SHARED_LIBRARIES := libutils表示生成的庫共享庫即動態鏈接庫
LOCAL_MODULE := libhello表示我們生成的庫名爲libhello.os
include$(BUILD_SHARED_LIBRARY)表示生成的庫共享庫即動態鏈接庫
6.使用NDK工具生成.so文件
(1)到工程目錄下
(2)使用ndk-build
代碼如下:
cd /root/Desktop/android_jni/jniTest01
ndk-build
這時我們在eclipse裏面刷新一下,發現,出現了obj和libs兩個文件夾,裏面都包含了我們需要的.so文件。
7.在eclipse裏面運行查看結果