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. (转)go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin

    转自:http://www.baiyuxiong.com/?p=886 ---------------------------------------------------------------- ...

  2. python中redis查看剩余过期时间以及用正则通配符批量删除key的方法

    # -*- coding: utf-8 -*- import redis import datetime ''' # 1. redis设置过期时间的两种方式 expire函数设置过期时间为10秒.10 ...

  3. 网络广告CPS/CPC/CPV/CPM/CPA分别是什么意思

    CPA:注册广告(一般按用户来计算)CPC:点击广告(一般按一千个ip计算)CPS:消费广告(用户通过你的网站中投放的广告,达成消费,有提成)CPM:展示广告(展示广告,一般的视频比较多)CPV:按照 ...

  4. Spark中的IsNotNull函数怎么用

    Spark中的IsNotNull函数怎么用 在这里看到的这个函数,就是判断是否为空,但是开始不知道怎么用,后来找到了,要在View中用,也就是SparkSQL中.如下: spark.sql(" ...

  5. Lintcode: First Bad Version 解题报告

    First Bad Version http://lintcode.com/en/problem/first-bad-version The code base version is an integ ...

  6. Redis 相关操作

    1.安装 下载地址:http://www.redis.cn/ 在使用Redis时,开始就遇到了问题,客户端打不开,原因是需要先开启服务端,这需要先配置—— 1.下载好redis安装包,解压安装之后,复 ...

  7. 【Java】LinkedBlockingQueue、PriorityQueue and ConcurrentLinkedQueue

    1.LinkedBlockingQueue: 基于链接节点的可选限定的blocking queue . 这个队列排列元素FIFO(先进先出). 队列的头部是队列中最长的元素. 队列的尾部是队列中最短时 ...

  8. 利用 fdisk进行分区

    ):fdisk命令参数 p:打印分区表. n:新建一个新分区. d:删除一个新分区. q:退出不保存. w:退出且保存. 例子: 先看下磁盘: root@archiso ~ # lsblk 在这里对磁 ...

  9. 使用卷积神经网络CNN训练识别mnist

    算的的上是自己搭建的第一个卷积神经网络.网络结构比较简单. 输入为单通道的mnist数据集.它是一张28*28,包含784个特征值的图片 我们第一层输入,使用5*5的卷积核进行卷积,输出32张特征图, ...

  10. 基于jquery下拉列表树插件代码

    分享一款基于jquery下拉列表树插件代码.这是一款实用的jquery 树形下拉框 下拉树代码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <table width= ...