Android NDK开发:Native层生成数组并打印
2019-07-19 本文已影响8人
itfitness
目录
目录效果展示
Native层生成数组
- Java代码中进行声明Native方法
/**
* 获取数组
* @return
*/
public native int[] getArray();
- C语言代码中对方法进行定义(生成Native方法的操作请看Android NDK开发小技巧)
JNIEXPORT jintArray JNICALL Java_com_hehuidai_ndkdemo01_MainActivity_getArray
(JNIEnv * env, jobject jobj) {
jsize arraySize = 5;//数组的长度为5
jintArray intArray = (*env)->NewIntArray(env,arraySize);//生成一个数组长度为5的int类型的数组
jint *arrayPointer = (*env)->GetIntArrayElements(env,intArray,NULL);//获取数组的元素指针,这里会返回数组第一个元素的地址
int i = 0;
for (i = 0; i < arraySize;i++) {
*(arrayPointer + i) = i*i;//给数组每个元素赋值
}
(*env)->SetIntArrayRegion(env,intArray, 0, arraySize, arrayPointer);//将赋好的值加到数组里
return intArray;//返回数组
}
Native层进行Log输出
- 代码实现
#include <jni.h>
#include<android\log.h>//引入log头文件
#define LOG_TAG "我是NativeLOG" //宏定义Log的Tag
#define LOGE(format,...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,format,__VA_ARGS__) //宏定义输出方法,这里主要是为了简化代码,需要注意的是__VA_ARGS__在这里是固定写法代表了可变参数
JNIEXPORT jintArray JNICALL Java_com_hehuidai_ndkdemo01_MainActivity_getArray
(JNIEnv * env, jobject jobj) {
jsize arraySize = 5;
jintArray intArray = (*env)->NewIntArray(env,arraySize);
jint *arrayPointer = (*env)->GetIntArrayElements(env,intArray,NULL);
int i = 0;
for (i = 0; i < arraySize;i++) {
*(arrayPointer + i) = i*i;
LOGE("%d", *(arrayPointer + i) );//对数组元素进行打印
}
(*env)->SetIntArrayRegion(env,intArray, 0, arraySize, arrayPointer);
return intArray;
}
- Log函数讲解
我们在log.h的源码中可以看到我们使用的方法如下,这个方法需要5个参数:
- prio:打印级别,在源码中我们可以看到一共有9种级别,分别与Java中的相对应
typedef enum android_LogPriority {
ANDROID_LOG_UNKNOWN = 0,
ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
}
- tag:打印的Tag
- fmt:格式化规则,比如想要输出整型数值就用“%d”,规则跟C语言的printf的格式化规则一样
- ...:需要格式化的参数,可以是多个
/*
* Send a formatted string to the log, used like printf(fmt,...)
*/
int __android_log_print(int prio, const char *tag, const char *fmt, ...)