【Android JNI】 C/C++ 标准输入输出打印至Android日志控制台

【Android】 C/C++ 标准输入输出打印至Android日志控制台

C++ 复制代码
#if defined(__ANDROID__)
start_logger("yeasound_sdk-native");
#endif

#if defined(__ANDROID__)
#include <stdio.h>
#include <unistd.h>
#include <android/log.h>
#include <android/native_activity.h>
#include <android/asset_manager_jni.h>
#include <android/asset_manager.h>
#endif


#if defined(__ANDROID__)
extern "C" {
    static int pfd[2];
    static pthread_t thr;
    static const char *tag = "myapp";
    static void *thread_func(void *)
    {
        ssize_t rdsz;
        char buf[128];
        while ((rdsz = read(pfd[0], buf, sizeof buf - 1)) > 0) {
            if (buf[rdsz - 1] == '\n') --rdsz;
            buf[rdsz] = 0;  /* add null-terminator */
            __android_log_write(ANDROID_LOG_DEBUG, tag, buf);
        }
        return 0;
    }

    int start_logger(const char *app_name)
    {
        tag = app_name;

        /* make stdout line-buffered and stderr unbuffered */
        setvbuf(stdout, 0, _IOLBF, 0);
        setvbuf(stderr, 0, _IONBF, 0);

        /* create the pipe and redirect stdout and stderr */
        pipe(pfd);
        dup2(pfd[1], 1);
        dup2(pfd[1], 2);

        /* spawn the logging thread */
        if (pthread_create(&thr, 0, thread_func, 0) == -1)
            return -1;
        pthread_detach(thr);
        return 0;
    }
}
#endif


JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    JNIEnv *env;
    if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return JNI_ERR;
    }

#if defined(__ANDROID__)
    start_logger("yeasound_sdk-native");
#endif

    /* --javaVM是虚拟机在JNI中的表示 --*/
    env->GetJavaVM(&g_jni_vm);
    if (g_jni_vm == nullptr) {
        return JNI_ERR;
    }

    jni_utils_set_global_vm(g_jni_vm);

    if(jni_cache_init() != YeasoundLib::YS_STATUS_SUCCESS){
        return JNI_ERR;
    }

    return JNI_VERSION_1_6;
}
相关推荐
阿杰真不会敲代码几秒前
webSocket入门
java·网络·spring boot·websocket·网络协议
木风小助理5 分钟前
Kotlin内联函数及其关联关键字的深度解析
android·java·开发语言
2401_882351525 分钟前
Flutter for OpenHarmony 商城App实战 - 优惠券实现
android·flutter
天若有情6735 分钟前
详解Two Pair函数:「一次握手,一次挥手」,让函数调用更严谨、更安全
网络·c++·后端·安全·设计
Howrun7775 分钟前
虚幻引擎_UI搭建流程
c++·游戏引擎·虚幻
刘一说9 分钟前
Java语言多态特性在Spring Boot中的体现:从原理到实战
java·开发语言·spring boot
郑州光合科技余经理14 分钟前
同城O2O系统架构解析:中台化如何赋能本地生活服务
java·开发语言·javascript·人工智能·系统架构·php·生活
得一录14 分钟前
如何将大模型(Gemini)集成到 Android 语音助手中
android·aigc
qq_124987075315 分钟前
基于微信小程序的垃圾分类信息系统(源码+论文+部署+安装)
java·前端·spring boot·后端·微信小程序·小程序·计算机毕业设计
带刺的坐椅16 分钟前
带来 Multi Agent 开发,OpenSolon v3.8.3 发布
java·ai·agent·solon·mcp