【发布时间】:2014-08-08 11:31:22
【问题描述】:
我正在移植我的一个应用程序,因此大部分工作都在应用程序的本机部分完成,而 Java 端纯粹是为了我的 UI。
我目前正在尝试实现的是一个 ProgressBar,它将显示本机线程操作的状态。 UI 由不同的活动组成,我打算显示这些活动的进度条。
问题是:我该怎么做?我有一些本机代码如下:
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 类,或者如果我所做的完全错误,则将我置于不同的轨道上。我也打算阅读 Handlers,但我认为我的理解还没有那么远。
注意:我确实意识到我可以从 Java UI 轮询一些本机变量,但我更喜欢回调/事件处理实现而不是轮询。
【问题讨论】:
-
调用
FindClass()的本机代码如何调用? -
@Hans Kratz:我有一个 pthread 正在运行处理从 Java Activity 发送到本机线程的消息。本机线程在循环中连续运行并处理它从 Java UI 获得的任何消息。
标签: java android callback android-ndk native