本文介绍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]);
}
运行结果: