【问题标题】:Renaming package breaks JNI function Android studio重命名包会破坏 JNI 功能 Android Studio
【发布时间】:2018-05-31 09:27:54
【问题描述】:

我正在使用 openCV,它运行良好,直到我更改了包名称。我搜索了谷歌和 stackoverflow,但没有任何结果。 已经一天了,我很沮丧。 这是日志猫。 任何帮助将不胜感激。

12-18 08:37:24.328 12081-12144/in.indilabz.in.cbxprint E/art: No implementation found for void in.indilabz.in.cbxprint.editor.filter.PhotoProcessing.nativeApplyFilter(int, int, long, long) (tried Java_in_indilabz_in_cbxprint_editor_filter_PhotoProcessing_nativeApplyFilter and Java_in_indilabz_in_cbxprint_editor_filter_PhotoProcessing_nativeApplyFilter__IIJJ)
12-18 08:37:24.333 12081-12144/in.indilabz.in.cbxprint E/UncaughtException: java.lang.RuntimeException: An error occured while executing doInBackground()
                                    at android.os.AsyncTask$3.done(AsyncTask.java:304)
                                    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                    at java.lang.Thread.run(Thread.java:818)
                                Caused by: java.lang.UnsatisfiedLinkError: No implementation found for void in.indilabz.in.cbxprint.editor.filter.PhotoProcessing.nativeApplyFilter(int, int, long, long) (tried Java_in_indilabz_in_cbxprint_editor_filter_PhotoProcessing_nativeApplyFilter and Java_in_indilabz_in_cbxprint_editor_filter_PhotoProcessing_nativeApplyFilter__IIJJ)
                                    at in.indilabz.in.cbxprint.editor.filter.PhotoProcessing.nativeApplyFilter(Native Method)
                                    at in.indilabz.in.cbxprint.editor.filter.PhotoProcessing.processImage(PhotoProcessing.java:26)
                                    at in.indilabz.in.cbxprint.editor.fragment.RecyclerMenuFragment$GetFilterThumbsTask.doInBackground(RecyclerMenuFragment.java:144)
                                    at in.indilabz.in.cbxprint.editor.fragment.RecyclerMenuFragment$GetFilterThumbsTask.doInBackground(RecyclerMenuFragment.java:134)
                                    at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                    at java.lang.Thread.run(Thread.java:818) 
12-18 08:37:24.459 696-714/? E/SensorService: activeConnections...
12-18 08:37:24.459 696-714/? E/SensorService: activeConnections...
12-18 08:37:24.625 12081-12144/in.indilabz.in.cbxprint E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
                                Process: in.indilabz.in.cbxprint, PID: 12081
                                java.lang.RuntimeException: An error occured while executing doInBackground()
                                    at android.os.AsyncTask$3.done(AsyncTask.java:304)
                                    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                    at java.lang.Thread.run(Thread.java:818)
                                Caused by: java.lang.UnsatisfiedLinkError: No implementation found for void in.indilabz.in.cbxprint.editor.filter.PhotoProcessing.nativeApplyFilter(int, int, long, long) (tried Java_in_indilabz_in_cbxprint_editor_filter_PhotoProcessing_nativeApplyFilter and Java_in_indilabz_in_cbxprint_editor_filter_PhotoProcessing_nativeApplyFilter__IIJJ)
                                    at in.indilabz.in.cbxprint.editor.filter.PhotoProcessing.nativeApplyFilter(Native Method)
                                    at in.indilabz.in.cbxprint.editor.filter.PhotoProcessing.processImage(PhotoProcessing.java:26)
                                    at in.indilabz.in.cbxprint.editor.fragment.RecyclerMenuFragment$GetFilterThumbsTask.doInBackground(RecyclerMenuFragment.java:144)
                                    at in.indilabz.in.cbxprint.editor.fragment.RecyclerMenuFragment$GetFilterThumbsTask.doInBackground(RecyclerMenuFragment.java:134)
                                    at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                    at java.lang.Thread.run(Thread.java:818) 

【问题讨论】:

  • JNI 使用 javah 工具从 Java 类生成本机函数的名称。生成的名称包括包、类和方法名称,包括参数和返回类型。因此,如果您更改了包的名称,则必须重新运行javah,然后您必须更改所有本机函数的实现以匹配新生成的头文件。这就是为什么您会收到 UnsatisfiedLink 错误...Java VM 在您的本机 .so 中找不到方法,因此具有正确的名称来实现您的类的本机方法。
  • 我不确定重命名包是否值得。法律要求您披露您的项目使用 OpenCV(根据 the OpenCV license),所以我不确定您将其嵌入到自己的包中的动机是什么。

标签: java android-studio opencv java-native-interface


【解决方案1】:

根据@lockcmpxchg8b 的评论,我在javah 上查找参考资料,并找到了this article,在那里我找到了答案。

要解决这个问题,您需要检查 make 文件(可能在像 app/src/main/jni/Android.mk 这样的地方)。它应该包含像LOCAL_MODULELOCAL_CFLAGSLOCAL_SRC_FILES 这样的值。

LOCAL_SRC_FILES 会列出一些 .cpp 文件。在名称为 Java_old_package_name_editor_filter_PhotoProcessing_nativeApplyFilter 的文件之一中找到函数并将 old_package_name 更改为您的新包。

【讨论】:

  • 就我而言,我在项目中没有找到任何Android.mk,但我在Java_old_package_name_....cpp 文件中找到了一些函数。重命名它们后,该项目按预期工作。另外,对我来说,函数的名称是折叠的,所以我一开始并没有注意到它们。
猜你喜欢
  • 1970-01-01
  • 2011-06-23
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2014-09-15
相关资源
最近更新 更多