我移植了我的应用程序,因此大多数工作都是在应用程序的本机部分完成的,而Java端则完全是为了我的UI。
我现在尝试实现的是ProgressBar,它将显示本机线程的操作状态。 UI由不同的活动组成,我打算从这些活动中显示ProgressBars。
问题是:我该怎么办?我有一些本机代码如下:
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返回null类,或者如果我正在做的事情是完全错误的话,请把我放在不同的轨道上。我打算阅读处理程序,但我不认为我的理解还远远不够。
注意:我确实意识到我可以从Java UI中轮询一些本机变量,但我更喜欢回调/事件处理实现而不是轮询。
答案 0 :(得分:2)
如果您的代码未从Java方法调用,它将使用FindClass()
中的系统类加载器,它只知道Android系统类。
我建议使用JNI_OnLoad
中的类的引用,通过NewGlobalRef
创建对该类的全局引用,并将其传递给您的线程或将其存储在全局变量中。
有关此行为的详细信息:http://markmail.org/message/25rrwp4va443rjuk#query:+page:1+mid:2u5wlkjyugwp75qa+state:results