我正在移植我的应用程序,因此大部分工作是在应用程序的本机部分内完成的,而Java端仅用于我的UI。
我目前正在尝试实现的是一个ProgressBar,它将显示本机线程的操作状态。 UI由不同的Activity组成,我打算显示这些Activity中的ProgressBar。
问题是:我该怎么做?我有一些本地代码,如下所示:
jclass clazz = emv->FindClass( "com/example/myapp/MainActivity" );
对于clazz返回null。我意识到当时实际上没有显示MainActivity活动-这是我的SettingsActivity的一个实例,因此我尝试相应地更改上述行,但它仍返回null。
无法从本机代码调用FindClass()来检索Activity类吗?
最终,我认为我需要做的是调用如下方法:
public void ProgressUpdateFromNative( int i )
{
runOnUiThread( new Runnable()
{
@Override
public void run()
{
DisplayProgressUpdate();
}
} );
}
..那是我的一项活动中的一种方法。
jmethodID ProgressUpdateFromNative = env->GetMethodID( clazz, "ProgressUpdateFromNative", "(I)V");
env->CallObjectMethod( g_pObj, ProgressUpdateFromNative, 1 ) ;
我已经从onLoad()JNI调用中检索了JavaVM指针,并调用了JavaVM-> AttachCurrentThread()来检索上面使用的env指针。
有人可以告诉我我想念的东西吗-即-为什么我从FindClass返回空类,或者如果我做的是完全错误的,请把我放在另一个轨道上。我也打算阅读有关Handlers的内容,但我认为我的理解还不那么深入。
注意:我确实意识到我可以从Java UI中轮询一些本机变量,但是我更喜欢回调/事件处理实现而不是轮询。
最佳答案
如果未从Java方法调用您的代码,它将使用FindClass()
中的系统类加载器,该类仅了解Android系统类。
我建议使用对JNI_OnLoad
中的类的引用,通过NewGlobalRef
创建对该类的全局引用,并将其传递给线程或将其存储在全局变量中。
有关此行为的更多信息:http://markmail.org/message/25rrwp4va443rjuk#query:+page:1+mid:2u5wlkjyugwp75qa+state:results