andorid ndk 各种坑啊 记录下
2024-08-24 06:59:02
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
最新文章
- Python for Infomatics 第13章 网页服务四(译)
- java 接口
- 第一次在linux上登录博客
- Scalaz(44)- concurrency :scalaz Future,尚不完整的多线程类型
- [转]-Lua协程的实现
- Python:映像、集合
- MVC之ActionResult
- 对Spring from中日期显示格式化问题
- Kubernetes 持续集成 SpringCloud
- IOS的属性和实例变量
- Java 用栈实现队列
- 概述Java集合框架
- UVA 165 Stamps (DFS深搜回溯)
- 说说GPIO.H(NUC131)
- Oracle与EntityFramework(EF)的一些事情
- 进程自我保护 适用于WIN7 X64
- spring配置bean的生命周期
- HDU 5935 Car【贪心,枚举,精度】
- Educational Codeforces Round 32
- OceanBase 2.1 的ORACLE兼容性能力探秘
热门文章
- sbt编译spark程序提示value toDF is not a member of Seq()
- How to disable SSL certificate checking with Spring RestTemplate?(使用resttemplate访问https时禁用证书检查)
- 组策略分发Adobe Reader 11教程
- Android背景颜色渐变
- 2. 集成学习(Ensemble Learning)Bagging
- docker探索-docker容器基本操作(五)
- 常用Git命令清单(转)
- C语言 &#183; 比较字符串
- Docker常用命令<;转>;
- Ehcache BlockingCache 源码分析