NDK 使用实例

本文详细介绍了在Android中使用NDK进行文件读写及JNI数组处理的实例。首先展示了如何通过NDK读写SD卡文件,包括在Java层定义方法、生成C头文件、编写C代码以及执行测试。接着,文章探讨了JNI数组处理,包括接收Java层的int数组并在C层进行操作,最后返回一个新的int数组并进行测试。通过这两个实例,读者可以深入理解Android NDK的使用方法。
摘要由CSDN通过智能技术生成

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









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值