美文网首页Android-NDK/JNI
Android NDK开发:Native层生成数组并打印

Android NDK开发:Native层生成数组并打印

作者: itfitness | 来源:发表于2019-07-19 11:56 被阅读8次

目录

目录

效果展示

Native层生成数组

  1. Java代码中进行声明Native方法
/**
     * 获取数组
     * @return
     */
    public native int[] getArray();
  1. 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输出

  1. 代码实现
#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;
}
  1. 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, ...)

相关文章

网友评论

    本文标题:Android NDK开发:Native层生成数组并打印

    本文链接:https://www.haomeiwen.com/subject/josjlctx.html