LINUX 多线程 JNI 回调 java static C++/C String 拼接

1.Linux 开启线程

//渲染线程Rendering
void* thread_rendering_process(void *lParam) {

    unsigned int local_wr;
    int index;
    int needsDetach;

    JNIEnv *evn = getJNIEnv(&needsDetach);
    (*evn)->CallStaticVoidMethod(evn, globalJclazz, methodID_ShowLog, 1);

//
    if (needsDetach)
        (*g_VM)->DetachCurrentThread(g_VM);

}

int media_decode_start() {
    gZpvInfo.stream_run_flag = 1;
    createThreadStatus = pthread_create(&thrd_media_rending, NULL,
            thread_rendering_process, NULL);

    if (createThreadStatus) {
        return -1;
    }
    return 0;
}

 

//全局jev 多线程中需要用到全局的 JNIEnv

jmethodID methodID, methodID_ShowLog;
JavaVM *g_VM;
jclass globalJclazz;
JNIEnv* globalEnv = NULL;
JNIEnv* getJNIEnv(int* needsDetach);

JNIEnv* getJNIEnv(int* needsDetach) {
    JNIEnv* env = NULL;
    jint result = -1;
    if ((*g_VM)->GetEnv(g_VM, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        int status = (*g_VM)->AttachCurrentThread(g_VM, &env, 0);
        if (status < 0) {
            return NULL;
        }
        *needsDetach = 1;
    }
    return env;
}

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {

    g_VM = vm;
    static const char* const zClassName = "com/xxx/media/xxx";

    if ((*vm)->GetEnv(vm, (void**) &globalEnv, JNI_VERSION_1_4) != JNI_OK)
        return -1;

    jclass clazz = (*globalEnv)->FindClass(globalEnv, zClassName);
    globalJclazz = (*globalEnv)->NewGlobalRef(globalEnv, clazz); //转为全局引用
    if (clazz == NULL) {
        LOGI("OnLoad cannot get class:%s\n", zClassName);
        return -1;
    }

    if ((*globalEnv)->RegisterNatives(globalEnv, clazz, gMethods,
            sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK) {
        LOGI("OnLoad register native method failed!\n");
        return -1;
    }
    methodID = (*globalEnv)->GetStaticMethodID(globalEnv, clazz,
            "onFrameBuffer", "([BI)V");
    methodID_ShowLog = (*globalEnv)->GetStaticMethodID(globalEnv, clazz,
            "showLog", "(I)V");

    return JNI_VERSION_1_4;
}

 

2、C++中4种方式把字符串和数字连接起来

https://blog.csdn.net/PROGRAM_anywhere/article/details/63720261
 

int a = getVersion();
printf("%d", a);
char* hello = "Hello from C++ 2fff";
char *buf = new char[strlen(hello) + sizeof(a) + 1];
sprintf(buf, "%s%d", hello, a);
return env->NewStringUTF(buf);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值