NDK 使用實例

本文介紹Android 使用 NDK的幾個實例

實例:

  • 使用NDK讀寫SD卡文件
  • JNI 數組處理

一.使用NDK讀寫文件

  1. 定義Java層方法,該方法傳遞一個存儲路徑到C
  2. 編譯頭文件
  3. 編輯C文件並編譯生成so庫
  4. 運行測試

1.本例實現一個用從Java層傳遞一個路徑到C層,在C中創建一個文件,在文件中寫入內容並保存。事先聲明Java 層的Native 方法

public class MainActivity extends Activity {

	public static native void saveFile(String path);

	static {
		System.loadLibrary("saveFile");
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 不同的手機的sdcard的路徑不同,我這裏用的moto g測試
		saveFile("/sdcard/ndk_writefile_test.txt");

	}

}


2.定義了native方法之後需要用javah命令生成頭文件,參考 NDK使用流程 

運行javah命令的時候一定要保證項目已經運行了一次,並生成了bin/classes文件


3.C實現文件讀寫操作

#include <stdio.h>
#include <stdlib.h>
#include "com_gmwtest_ndk_MainActivity.h"
#include <android/log.h>
#define TAG "Gmw"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)

JNIEXPORT void JNICALL Java_com_gmwtest_ndk_MainActivity_saveFile
(JNIEnv *env, jclass class, jstring string) {
	LOGV("save_file_test");
	char d[]="hello world,write some words";
	//把Java 的String類型轉化爲c中的char類型指針
	const char *file_path=(*env)->GetStringUTFChars(env,string,NULL);
	if(file_path!=NULL) {
		LOGV("file path: %s",file_path);
	} else {
		LOGV("file path is NULL");
	}
	/**打開一個文件,以a+ 的方式
	 * */
	FILE* file=fopen(file_path,"a+");
	if(file!=NULL) {
		LOGV("file open");
	} else {
		LOGV("file open error");
	}
	/**寫文件
	 * @arg0  要寫入的數據
	 * @arg1  要寫入的數據的長度
	 * @arg2  要寫入的次數
	 * @arg3  要寫入的目標文件
	 * */
	int count=fwrite(d,strlen(d),1,file);
	if(count>0) {
		LOGV("file write complete");
	} else {
		LOGV("file write error");
	}
	/**關閉文件
	 * */
	if(file!=NULL) {
		fclose(file);
	}

}

ndk-build命令生成so庫 參考 NDK使用流程 


4.運行測試



二.JNI數組處理

  1. 定義Java層方法,該方法傳遞一個int類型數組,並返回一個int類型數組
  2. 編譯頭文件
  3. 編輯C文件並編譯生成so庫
  4. 運行測試
1.定義native方法,先運行一下Android項目,再生成頭文件,爲了方便我們就在剛剛的項目上繼續就可以了。

public static native int[] changeArray(int[] array);

2.生成頭文件

3.編輯C文件

JNIEXPORT jintArray JNICALL Java_com_gmwtest_ndk_MainActivity_changeArray(
		JNIEnv *env, jclass class, jintArray array) {
	jint nativeArray[5];
	(*env)->GetIntArrayRegion(env, array, 0, 5, nativeArray);
	int m = 0;
	for (m = 0; m < 5; m++) {
		nativeArray[m] += 5;
	}
	(*env)->SetIntArrayRegion(env, array, 0, 5,nativeArray);
	return array;
}

編譯生成so庫

4.運行測試

int data1[] = { 1, 2, 3, 4, 5 };
int data2[] = changeArray(data1);
for (int i = 0; i < data2.length; i++) {
    Log.i("Gmw", "data2=" + data2[i]);
}
運行結果:









發佈了95 篇原創文章 · 獲贊 18 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章