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

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

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

    之前其他mac电脑安装tensorflow时候一切顺利,一行命令sudo pip install tensorflow就高搞定了,但是今天在新mac上安装tensorflow时候出现了一个bug,搞了 ...

  2. react-native 好多坑,记录下。

    1 classpath 'com.android.tools.build:gradle:1.2.3' 2.adb reverse tcp:8081 tcp:8081 3.react-native ru ...

  3. 记录下项目中常用到的JavaScript/JQuery代码一(大量实例)

    一直没有系统学习Javascript和Jquery,每次都是用到的时候去搜索引擎查,感觉效率挺低的.这边把我项目中用的的记录下,想到哪写哪,有时间再仔细整理. 当然,由于我主要是写后端java开发,而 ...

  4. 如何利用aop的环绕消息处理log, 以及各种坑的记录

    如何利用aop的环绕消息处理log, 以及各种坑的记录 本文链接: https://www.cnblogs.com/zizaiwuyou/p/11667423.html 因为项目里有很多地方要打log ...

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

    Windows Server 2012搭建SQL Server Always On踩坑全记录 环境信息: Windows Server 2012 R2 Sql Server 2012 整个搭建集群的过 ...

  6. 随便记录下系列 - node->express

    随便记录下系列 - node->express 文章用啥写?VsCode. 代码用啥写?VsCode. 编辑器下载:VsCode 一.windows下安装node.js环境: 下载地址 相比以前 ...

  7. 记录下UIButton的图文妙用和子控件的优先显示

    UIButton的用处特别多,这里只记录下把按钮应用在图文显示的场景,和需要把图片作为按钮的背景图片显示场景: 另外记录下在父控件的子控件优先显示方法(控件置于最前面和置于最后面). 先上效果图: 1 ...

  8. 记录下ECharts的一些功能

    用到ECharts记录下一些功能免得以后找文档找不到. 这个博客对ECharts讲解很全面 http://www.stepday.com/my.stepday/?echarts // 使用 requi ...

  9. C#值类型以及默认值记录下

    C#的值类型有bool,byte,sbyte,decimal,double,float,int,uint,long,string等 如果我们擅长使用默认值,可以帮助我们减少带来赋值及代码编写. 比如我 ...

随机推荐

  1. 每日英语:The Toy Mogul Who Became A Billionaire Through His Fight To The Death With Barbie

    The trophy case in the tiny conference room outside Isaac Larian’s corner office spans an entire wal ...

  2. shell(2):传入参数

    $1,$2  分别表示第一个第二个参数 #!bin/sh ref=$1 trans=$2 echo $ref echo $trans

  3. docker容器资源配额控制

    转自:http://blog.csdn.net/horsefoot/article/details/51731543 文/ 天云软件 容器技术团队 Docker通过cgroup来控制容器使用的资源配额 ...

  4. [开源项目-MyBean轻量级配置框架] 使用MyBean快速搭建分模块的应用程序(主页面的TAB)(DLL-MDI)

    [概述] 抱歉由于上次开源比较匆忙,没有来的及做一个DEMO,里面也有些垃圾的文件没有及时清理.DEMO其实昨天晚上已经调通.相关说明文档今天晚上才说明好,欢迎大家继续关注和交流,和大家一起分享我10 ...

  5. 将String转换成InputStream

    String   str   =   "";//add   your   string   contentInputStream   inputStream   =   new   ...

  6. 越狱机器SSH安装与使用

    SSH安装html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirror-scroll { ...

  7. 【Java笔记】配置文件java.util.Properties类的使用

    配置文件的路径:项目名/src/main/resources/mmall.properties mmall.properties的内容是键值对.例如假设写了ftp服务器的一些信息. ftp.serve ...

  8. Redis (1) —— 安装

    Redis (1) -- 安装 摘要 介绍Mac OS X安装Redis基本方法 版本 Redis版本: 2.8.24 内容 下载Redis包 地址:http://download.redis.io/ ...

  9. 【进阶修炼】——改善C#程序质量(9)

    140,使用默认的访问修饰符. 如果不加访问修饰符,成员变量的默认是private的,类默认是internal的.为了明确访问的权限,我倒是建议都加上访问修饰符,这省不了多少代码. 141,不知道该不 ...

  10. 如何让其他机器访问你的oracle数据库

    修改listen.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = E:\a ...