JNI多线程中findclass怎么用找自定义的类

Haier221924 2010-11-15 02:44:51
我要用ndk编译c++的代码,其中包含了多线程,主线程和回调线程。
在主线程中使用env->GetJavaVM(&g_jvm);得到了全局的vm,
在回调线程中我首先得到了env:
JNIEnv* env = NULL;
g_jvm->AttachCurrentThread(&env, NULL);
然后利用
jclass cls = env->FindClass("vc/db/DataSearchService");
其中vc/db是包名,DataSearchService是自定义的类名,调用第二次后程序就挂了,可是如果把类改成
"java/lang/String"就没问题,怎么办呢?

在主线程中调用 env->FindClass("vc/db/DataSearchService");是没有问题的
...全文
1630 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxiao_473 2011-09-23
  • 打赏
  • 举报
回复
不过刚才试了下,把jclass和jmethodID都设为全局的就没问题了
static jclass g_fc;
static jmethodID g_addFG;
难道要把每个支持多线程环境的函数都声明为全局的?
谁有更好的办法啊?
wuxiao_473 2011-09-23
  • 打赏
  • 举报
回复
我今天也遇到了跟楼主一样的问题,请问是咋样解决的呢
zhuzeitou 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lbinim 的回复:]

定义全局变量cls,

在主线程调用 jclass cls = env->FindClass("vc/db/DataSearchService"); 后把cls保存起来,以后直接用。
[/Quote]

还要用NewGlobalRef为这个cls申请全局引用,否则这只是个局部引用,跨线程仍然挂

[Quote=引用 4 楼 jiangpingzhan 的回复:]

引用 1 楼 lbinim 的回复:
定义全局变量cls,

在主线程调用 jclass cls = env->FindClass("vc/db/DataSearchService"); 后把cls保存起来,以后直接用。


请教NDK 编译时提示找不到 AttachCurrentThread 怎么处理 ?
[/Quote]

你#include <jni.h>了吗?
jiangpingzhan 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lbinim 的回复:]
定义全局变量cls,

在主线程调用 jclass cls = env->FindClass("vc/db/DataSearchService"); 后把cls保存起来,以后直接用。
[/Quote]

请教NDK 编译时提示找不到 AttachCurrentThread 怎么处理 ?
jiangpingzhan 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 haier221924 的回复:]
我要用ndk编译c++的代码,其中包含了多线程,主线程和回调线程。
在主线程中使用env->GetJavaVM(&g_jvm);得到了全局的vm,
在回调线程中我首先得到了env:
JNIEnv* env = NULL;
g_jvm->AttachCurrentThread(&env, NULL);
然后利用
jclass cls = env->FindClas……
[/Quote]

楼主你好请问一下有没有这方面的例子 ? 方便的时候麻烦你给我发份
一本假正经 2010-12-13
  • 打赏
  • 举报
回复
定义全局变量cls,

在主线程调用 jclass cls = env->FindClass("vc/db/DataSearchService"); 后把cls保存起来,以后直接用。

80,488

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧