本文介紹Android 使用 NDK的幾個實例
實例:
- 使用NDK讀寫SD卡文件
- JNI 數組處理
一.使用NDK讀寫文件
- 定義Java層方法,該方法傳遞一個存儲路徑到C
- 編譯頭文件
- 編輯C文件並編譯生成so庫
- 運行測試
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數組處理
- 定義Java層方法,該方法傳遞一個int類型數組,並返回一個int類型數組
- 編譯頭文件
- 編輯C文件並編譯生成so庫
- 運行測試
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]);
}
運行結果: