Android NDK回调到Java活动

时间:2014-06-18 08:43:45

标签: java android callback android-ndk native

我移植了我的应用程序,因此大多数工作都是在应用程序的本机部分完成的,而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中轮询一些本机变量,但我更喜欢回调/事件处理实现而不是轮询。

1 个答案:

答案 0 :(得分:2)

如果您的代码未从Java方法调用,它将使用FindClass()中的系统类加载器,它只知道Android系统类。

我建议使用JNI_OnLoad中的类的引用,通过NewGlobalRef创建对该类的全局引用,并将其传递给您的线程或将其存储在全局变量中。

有关此行为的详细信息:http://markmail.org/message/25rrwp4va443rjuk#query:+page:1+mid:2u5wlkjyugwp75qa+state:results