NDK全稱為Native Development Kit,是本地開發工具集。在Android開發中,有時為了能更好的重用以前的C/C++的代碼,需要將這些代碼編譯成相應的so,然後通地JNI以供上層JAVA調用。當然,也有的是為了更高的保護性和安全性。下面是實現的過程。
1、下載NDK TOOL
可以從http://developer.android.com/tools/sdk/ndk/index.html下載NDK TOOL,我下的是Windows 64-bit。
下載完後,直接安裝,路徑建議在根目錄下,比如D:\android-ndk-windows,然後將該路徑設定成環境變數。
2、測試下ndk的樣本
NDK TOOL中內建了很多例子,可以用ECLIPSE匯入,樣本位置在D:\android-ndk-windows\samples。剛剛的下載網站後面有樣本的說明(見)。
註:
(1)、指的就是ndk的根目錄,D:\android-ndk-windows.
(2)、jni檔案夾是必須的,如果自己建立項目,一定要記得把C代碼和mk檔案放到jni檔案夾下。
(3)、開啟CMD命令列,定位到工程所在的jni檔案夾,直接輸入ndk-build斷行符號即可產生相應的so.如果沒有將D:\android-ndk-windows設定成環境變數,需要輸入D:\android-ndk-windows\ndk-build。
(4)、執行完後,會在lib下的armeabi和armeabi-v7a下產生*.so檔案。見。
3、建立一個Android工程
(1)、在eclipse中建一個SharedObjectTest的Android工程,MainActivity.java的代碼如下:
MainActivity.java
package com.ex.sot;import android.app.Activity;import android.os.Bundle;import com.example.sumcalculator.R;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);int cs = NativeMachine.calculate(1,2);setTitle(cs + "");}}
(2)、增加一個NativeMachine.java的類。代碼如下:
NativeMachine.java
package com.ex.sot;import android.util.Log;public class NativeMachine {static {try {Log.i("JNI", "Trying to load libNativeJniAdder.so");System.loadLibrary("NativeMachine");} catch (UnsatisfiedLinkError ule) {Log.e("JNI", "WARNING:Gould not load libNativeJniAdder.so");}}public static native int calculate(int digit_1,int digit_2);}
3、JNI調用
(1)、執行genHeader.bat指令碼,產生相應的頭。
javah -classpath ../src com.ex.sot.NativeDataManage
(2)、調用的實現
com_ex_sot_NativeMachine.c
#include "Machine.h"#include "com_ex_sot_NativeMachine.h"extern void* MachineNew();JNIEXPORT jint JNICALLJava_com_ex_sot_NativeMachine_calculate(JNIEnv *env,jclass c,jint digit_1,jint digit_2){Machine* hadder=(Machine*)MachineNew();int newSn=hadder->encodeSn(hadder,digit_1);return newSn;}
4、用C實現功能
Machine.h
/* HalfAdder.h */#ifndef HMACHINE_H#define HMACHINE_H#include "lw_oopc.h"CLASS(Machine){int sn;int(*encodeSn)(void*,int);};#endif
Machine.c
/* Machine.c */#include "Machine.h"static int encodeSn(void* t,int sn){Machine* cthis=(Machine*)t;cthis->sn=sn;int newSn=cthis->sn*123;return newSn;}CTOR(Machine)FUNCTION_SETTING(encodeSn,encodeSn)END_CTOR/* end */
lw_oopc.h
/* lw_oopc.h */#ifndef LOOPC_H#define LOOPC_H#include #define CLASS(type)\typedef struct type type;\struct type#define CTOR(type)\void* type##New()\{\struct type *t;\t=(struct type*)malloc(sizeof(struct type));#define CTOR2(type,type2)\void* type2##New()\{\struct type *t;\t=(struct type *)malloc(sizeof(struct type));#define END_CTOR return (void*)t; };#define FUNCTION_SETTING(f1,f2) t->f1=f2;#define IMPLEMENTS(type) struct type type#define INTERFACE(type) struct type#endif/* end */
註:lw_oopc.h是c的物件導向實現,即常說的oopc。
5、編譯動態庫
定位到工程目錄下,執行ndk-build,產生*.so。
註:Android.mk和Application.mk是固定的名稱。其中Android.mk中的LOCAL_MODULE、LOCAL_SRC_FILES、LOCAL_CFLAGS是需要作相應的修改。
Android.mk(部分代碼)
LOCAL_MODULE := NativeMachineLOCAL_SRC_FILES := Machine.cifeq ($(TARGET_ARCH_ABI),armeabi-v7a) LOCAL_CFLAGS := -DHAVE_MACHINE=1 LOCAL_SRC_FILES += com_ex_sot_NativeMachine.cendif
6、安裝APK並運行
源碼下載
轉載請註明出處: