標籤:
使“java+c”的開發方式成為了官方支援的開發方式,NDK的本質就是為了讓Android應用程式能方便的使用JNI技術而提供的一套工具集合,使用NDK主要是4大好處,第一個,代碼的保護,,由於apk的java層代碼很容易被反編譯,而c/c++反組譯碼難度較大;第二個,可以很方便的使用開源庫,因為很多的現存的開源庫都是c/c++代碼編寫的;第三個,提高程式的執行效率,第四個,便於移植,使用c/c++寫的庫可以方便在其它的嵌入式平台上使用.這裡還有一個問題就是如果在模擬器上啟動並執行話,我們只能在ARM上運行,並不能在intel上運行,否則會無法載入那個so庫檔案
NDK環境搭建
第一步:下載NDK
第二步:建立一個Android工程
第三步:在該工程目錄的根目錄下建立一個jni目錄,用來作為ndk的編譯路徑(NDK的指令碼會根據jni目錄中的c/c++檔案以及mk檔案進行編譯產生so檔案)
第四步:建立builder(builder會使用ndk中的工具將jni目錄中的檔案編譯成為so檔案)Project->Properties->Builders->New->Program
。
對了,這段代碼實現的功能就是進行兩個int的加減,
這裡我們首先需要建立一個java檔案
package com.jk.ndkdemo;public class NDKBridge {public native int add(int a,int b);}
然後我們通過jdk中javah工具,根據NDKBridge類產生.h,在使用命令列時,我們要先進入到bin\clsses javah com.jk.ndkdemo.NDKBridge,產生的.h的命名的規則是包名_類名.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_jk_ndkdemo_NDKBridge */#ifndef _Included_com_jk_ndkdemo_NDKBridge#define _Included_com_jk_ndkdemo_NDKBridge#ifdef __cplusplusextern "C" {#endif/* * Class: com_jk_ndkdemo_NDKBridge * Method: add * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_jk_ndkdemo_NDKBridge_add (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus}#endif#endif
接下來我們根據h檔案中的內容,在jni目錄中建立c檔案
#include "com_jk_ndkdemo_NDKBridge.h"#include <stdlib.h>#include <stdio.h>#ifdef __cplusplusextern "C"{#endifJNIEXPORT jint JNICALL Java_com_jk_ndkdemo_NDKBridge_add (JNIEnv *env, jobject obj, jint a, jint b){//將jni類型轉換成C類型int a1 = a;int b1 = b;int c1 = a1 + b1;//將C類型轉成JNI類型jint c = c1;return c;}#ifdef __cplusplus}#endif然後我們建立mk檔案
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := MyNDKDemoLOCAL_SRC_FILES := com_jk_ndkdemo_NDKBridge.cinclude $(BUILD_SHARED_LIBRARY)
這裡的LOCAL_MODULE就是我們產生的so檔案的名字,LOCAL_SRC_FILES就是我們根據這個檔案來建立的,一旦我們儲存,那麼就會自動產生so檔案
然後我們就需要先載入so檔案,然後就可以使用了,這個步驟在activity中實現
package com.jk.ndkdemo;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.Toast;public class MainActivity extends Activity {// 載入so檔案static {System.loadLibrary("MyNDKDemo");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 獲得含有jni方法的對象NDKBridge bridge = new NDKBridge();// 調用jni方法int t = bridge.add(3, 5);Toast.makeText(this, "" + t, Toast.LENGTH_SHORT).show();}}
好了,一個簡單的jni編程就完成了。
android學習之jni編程初探