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

最新文章

  1. Python for Infomatics 第13章 网页服务四(译)
  2. java 接口
  3. 第一次在linux上登录博客
  4. Scalaz(44)- concurrency :scalaz Future,尚不完整的多线程类型
  5. [转]-Lua协程的实现
  6. Python:映像、集合
  7. MVC之ActionResult
  8. 对Spring from中日期显示格式化问题
  9. Kubernetes 持续集成 SpringCloud
  10. IOS的属性和实例变量
  11. Java 用栈实现队列
  12. 概述Java集合框架
  13. UVA 165 Stamps (DFS深搜回溯)
  14. 说说GPIO.H(NUC131)
  15. Oracle与EntityFramework(EF)的一些事情
  16. 进程自我保护 适用于WIN7 X64
  17. spring配置bean的生命周期
  18. HDU 5935 Car【贪心,枚举,精度】
  19. Educational Codeforces Round 32
  20. OceanBase 2.1 的ORACLE兼容性能力探秘

热门文章

  1. sbt编译spark程序提示value toDF is not a member of Seq()
  2. How to disable SSL certificate checking with Spring RestTemplate?(使用resttemplate访问https时禁用证书检查)
  3. 组策略分发Adobe Reader 11教程
  4. Android背景颜色渐变
  5. 2. 集成学习(Ensemble Learning)Bagging
  6. docker探索-docker容器基本操作(五)
  7. 常用Git命令清单(转)
  8. C语言 &#183; 比较字符串
  9. Docker常用命令&lt;转&gt;
  10. Ehcache BlockingCache 源码分析