我正在将许多.so库加载到Android应用程序中。当我进行JNI调用时,函数在library.so中运行一个infinte循环,所以它永远不会返回调用函数。 我应该从Java线程进行JNI调用还是应该从库中的pthreads加载函数?哪个更好?
第二个问题:当用户退出MainActivity时,如何确保卸载库? 谢谢。
答案 0 :(得分:2)
对于第一个问题,可能差别很小。当您与Java交互时,您的本机线程将附加到JVM。它取决于你是否想用pthreads或Java线程进行线程编程,哪种模型对你的特定应用程序最有意义。
就第二个问题而言,你需要编写一些清理代码来以优雅的方式处理它。
答案 1 :(得分:1)
对于第一个问题,基本上是亚历克斯所说的。如果选择Java或pthreads,它应该没什么区别。
对于第二个问题,您应该在Java代码中存储指向已创建库的指针。最简单的方法是让你的Jni调用将这个指针作为jlong返回。但是,因为你的jni函数永远不会返回,你必须直接在本机代码中设置值。
在此处查看NativeHandle类的实现
http://thebreakfastpost.com/2012/01/26/wrapping-a-c-library-with-jni-part-2/
然后在主要活动退出之前(我在onDestroy()方法中假设)调用a jni函数阻止库运行