【问题标题】:Run native code in background在后台运行本机代码
【发布时间】:2014-02-19 19:04:41
【问题描述】:

我使用 OpenCV 和 Android NDK 制作了一个图像处理应用程序。现在,我想在我的主要活动中显示结果,该活动是包含一些基于本机图像处理应用程序的数据和图表的仪表板。

我环顾四周,发现原生代码只能作为活动(NativeActivity 类)运行,这是我目前的方法,主要活动被原生活动reference#1的空白屏幕替换。

我的问题是,这是真的吗?如何从主 Activity 运行我的本机代码,同时保持主 Activity 在前台处于活动状态而本机代码在后台运行?

谢谢大家!

【问题讨论】:

  • 我猜你也可以从 Service 运行你的本地代码。
  • 成功了吗?还是有什么问题?
  • 嗨@KanakSony,我尝试了你的建议。我做了一个服务,它基本上调用了本机活动(在 onHandleIntent 中)。我仍然得到错误 can't instantiate class com.example.ImageprocessService;没有空的构造函数
  • 首先,删除您的构造函数,因为您从 Service 继承了一个公共的零参数构造函数。然后,要么使它成为一个静态内部类,要么使它成为一个独立的公共 Java 类。您不能在这里使用常规的内部类,因为 Android 无法创建该内部类的实例。
  • 如果您根本不想要本地活动,为什么不直接使用从 Java 活动到 C++ 函数的 JNI 调用?

标签: android opencv android-ndk native


【解决方案1】:

我环顾四周,发现本机代码只能作为活动运行

没有。任何 Java 类都可以在 Android 中具有本机方法。您可以拥有一个后台工作线程,实现为Thread-派生类或Runnable,通过调用本机方法来完成后台工作。

pthreads 是另一种可能性,但这些线程对 Java 子系统是不可见的;您可能希望从工作线程调用 Java 代码 - 至少将某些内容传递回 UI 线程。如果工作线程首先在 Java 中启动会更容易。

郑重声明,Android 服务不是线程。它们在主线程上运行。线程可以从服务启动,但也可以从活动启动。线程的生命周期取决于您。

NativeActivity 的东西是为了拥有完全没有 Java 的应用程序。您不必遵循这种方式。

【讨论】:

  • 嗨,谢谢塞瓦。所以我想,根据您在上面的问题中来自 user2359247 的回答和评论,我可以设计我的应用程序来执行本机代码:在后台/工作线程中通过使用 JNI 调用本机代码?
  • 你可以。绝对地。我在我的应用程序中使用 boost 线程,同时运行 Java 和 C++,一切正常。
  • 是的,完成了,非常感谢@user2359247。最后,我修改了我的本机代码,从 android_app 到带有 JNI 包装器的纯 C++。 android_app 以前可用的所有函数(AAssetManager、ANativeWindow 等)都移到了 Java 部分。然后我按照 Seva 的建议将该方法称为工作线程。谢谢大家!
【解决方案2】:

Android 支持到 large extent 的 pthreads。随意在您的代码中使用pthread_create() 和她的亲属。

【讨论】:

  • 嗨,亚历克斯,感谢您的开诚布公建议。最后,我在主 Java 类中启动线程,而不是您的建议,因为它似乎符合我当前的目标。
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多