andorid ndk 各种坑啊 记录下

android jni代码回调java的问题

因为多线程原因会导致找不到java类,无法call函数的问题

问题1找不到java类

在JNI_OnLoad的时候 保存下来

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
    g_vm = vm;
    JNIEnv* env = NULL;
    jint result = -1;
    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        return -1;
    }
    assert(env != NULL);

    register_location_methods(env);
    result = JNI_VERSION_1_4;
    return result;
}
int register_location_methods(JNIEnv *env)
{
    jniEnv = env;
    jclass clazz;
    clazz = env->FindClass("com/TongBan/Chat/NetBilling");
    if (clazz == NULL) {
        return -1;
    }
    JNetBilling = clazz;

    onReceivedMsgType = env->GetStaticMethodID(clazz,
                    "OnReceivedMsgType", "(I)V");
//    env->CallStaticVoidMethod(JNetBilling, onReceivedMsgType, 1);
    return 0;
}

问题2多线程回调call函数

此处生成的JNIEnv无法获取到class 函数 等 须要之前保存好的全局变量

bool isAttacked = false;
    JNIEnv* env;
    int status = g_vm->GetEnv((void **) &env, JNI_VERSION_1_4);
    if (status < 0) {
        status = g_vm->AttachCurrentThread(&env, NULL);
        if (status < 0) {
            return len;
        }
        isAttacked = true;
    }
    env->CallStaticVoidMethod(JNetBilling,onReceivedMsgType,iMsgType);
    if (isAttacked) {
        g_vm->DetachCurrentThread();
    }

输出问题因为还是比較喜欢cout就百度了个cout输出到logCat日志的

int iMsgType = MSG_PACKET::GetMsgType(kBuffer);

    StreamBuf g_StreamBuf;
    std::cout.rdbuf(&g_StreamBuf);
    std::cout << iMsgType;//就可以显示到logCat
#include <iostream>
#include <streambuf>

class StreamBuf : public std::streambuf
{
    enum
    {
        BUFFER_SIZE = 255,
    };

public:
    StreamBuf()
    {
        buffer_[BUFFER_SIZE] = ‘\0‘;
        setp(buffer_, buffer_ + BUFFER_SIZE - 1);
    }

    ~StreamBuf()
    {
        sync();
    }

protected:
    virtual int_type overflow(int_type c)
    {
        if (c != EOF)
        {
            *pptr() = c;
            pbump(1);
        }
        flush_buffer();
        return c;
    }

    virtual int sync()
    {
        flush_buffer();
        return 0;
    }

private:
    int flush_buffer()
    {
        int len = int(pptr() - pbase());
        if (len <= 0)
            return 0;

        if (len <= BUFFER_SIZE)
            buffer_[len] = ‘\0‘;

#ifdef ANDROID
        android_LogPriority t = ANDROID_LOG_INFO;
        __android_log_write(t, "JNI_DEBUG", buffer_);
#else
        printf("%s", buffer_);
#endif

        pbump(-len);
        return len;
    }

private:
    char buffer_[BUFFER_SIZE + 1];
};

到这里 最终能够 互动了 android->server->android

时间: 2024-10-12 13:15:14

andorid ndk 各种坑啊 记录下的相关文章

Mac安装最新tensorflow遇到的坑,记录下方便后人

之前其他mac电脑安装tensorflow时候一切顺利,一行命令sudo pip install tensorflow就高搞定了,但是今天在新mac上安装tensorflow时候出现了一个bug,搞了半天终于搞完了... 网上还没啥相关解决措施,蛋碎一地,也没有相关用户po这问题,应该是新的tensorflow对mac的支持问题,废话不多说: mac上pip安装tensorflow时候,会先安装所有依赖包 在安装其中依赖包grpcio时候出现:(就是这个grpcio,原来的tensorflow里

使用Jquery遇到的坑,记录下

注册功能,jquery  ajax判断 用户名是否被占用 上面的代码总是返回 undefined ,原因大概是ajax异步延时导致的. 改ajax请求为同步

[cocos2dx 3.0 + xcode]坑点记录

1: 新项目创建 1.下载最新Python,安装 2.解压引擎包 3.运行终端,切换到引擎目录(直接cd拖动文件夹到光标即可得到路径) 4.按照文档例子: $ cd cocos2d-x $ ./setup.py $ source FILE_TO_SAVE_SYSTEM_VARIABLE $ cocos new MyGame -p com.your_company.mygame -l cpp -d NEW_PROJECTS_DIR $ cd NEW_PROJECTS_DIR/MyGame 如果需要

Windows Server 2012搭建SQL Server Always On踩坑全记录

Windows Server 2012搭建SQL Server Always On踩坑全记录 环境信息: Windows Server 2012 R2 Sql Server 2012 整个搭建集群的过程主要分为3步: 1.配置预控,并把机器加域. 2.配置windows故障转移集群(Windows Failover Cluster) 3.配置SQL Server Always On High Availability Group(AG) 踩坑全记录 预控配置 比较好配置,需要注意的是非预控机器在

记录下我曾经那些认为的小想法

每隔一段时间,脑袋瓜子就会冒出一些自认为是小想法. 这篇文章就记录下我以前的一些小想法以及以后的小想法,一种想记录下来,一直也没有机会和时间.直到现在一琢磨,赶紧记录下来吧,也许很多时候的灵光一闪真是一个不错的idea.记录下来前面想起的和现在以及以后的idea,因此这篇文章会不断地实时更新,越来越完善. IDea1 2012年,刚步入高中的时候的第二学期,依稀记得那时候的智能手机还没有想象的普遍,在校门口当时接触了第一台智能机,一个高仿iphone 4s的手机,当时和同学一狠心每人买了一台.当

谷歌眼镜记录下的真实朝鲜

今年四月份,Kenny Zhu利用谷歌眼镜在朝鲜拍下了许多照片,记录了真实的朝鲜,这也是全世界首次使用可穿戴设备拍摄的朝鲜照片. 这些照片与普通相机拍摄的朝鲜照片并没有太大不同,但是由于是第一人称视角,拍摄位置更加随意,观众更能体会身在其中的感觉,仿佛是自己在亲身游览这一神秘国度. 在朝鲜,拍摄照片有很严格的规定,游客只允许拍摄反应朝鲜正面形象的照片,Kenny Zhu也是冒险拍了一些不被允许的照片,这也多亏了谷歌眼镜拍照不太引人注意的特点. 谷歌眼镜记录下的真实朝鲜,布布扣,bubuko.co

Andorid开发学习---ubuntu 12.04下搭建超好用的安卓模拟器genymotion 安装卸载virtualbox 4.3

什么是Genymotion? Genymotion是一套完整的工具,它提供了Android虚拟环境.它简直就是开发者.测试人员.推销者甚至是游戏玩家的福音. Genymotion支持Windows.Linux和Mac OS等操作系统,容易安装和使用:按简单的安装过程,选择一款Android虚拟设备,开启后就体验Genymotion带来的快感吧.-----引自百度百科 一.下载并安装genymotion 1.下载genymotion http://www.genymotion.cn/#theme=

Winform程序当运行exe 停止响应时 如何记录下日志?

通常我们在写程序时会对程序中可能出错的程序段用try catch 捕捉获取.这样程序运行中一旦有bug.用户也能快速定位到错误段去了解出错原因. 遇到的问题: 但是遇到这样的情况 有时候没有用到try catch 时出错了.程序直接停止响应.这时候对于开发人员就比较伤脑筋.无法快速debug C#程序如何捕捉未try/catch的异常--不弹"XXX已停止工作"报错框? 解决方法: 1:在Main主程序中添加代码 设置 Windows 窗体线程和其他线程上发生的异常发生异常的事件处理的

记录下自己(持续更新)

本身就是个怀旧的人,无聊的时间记录下自己生活的点点滴滴, 更无聊的时候看下喽!那就从衣食住行乐随便说一下啦.(个人观点)互联网时代了,说没有隐私也可以,说有隐私也行,就看别人怎么对你了,我不喜欢对事情 下定论,我觉着一切皆有可能.(想把衣食住行什么的分开来写,试了几次,格式总是不太好,也不太喜欢拘束,就随便加了个分隔线,写到哪就算哪了) --------------------------------------------------------------------------分隔线---