Android之NDK開發的簡單一實例

來源:互聯網
上載者:User

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並運行

源碼下載

轉載請註明出處:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.