Android的JNI實現基礎

                                                                                                                 Android_Jni學習總結

Androidjni的實現方法

1.編寫我們的androidjava源碼

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裏面刷新一下,發現,出現了objlibs兩個文件夾,裏面都包含了我們需要的.so文件。

7.eclipse裏面運行查看結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章