Java 重命名包将破坏JNI函数Android studio

Java 重命名包将破坏JNI函数Android studio,java,android-studio,opencv,java-native-interface,Java,Android Studio,Opencv,Java Native Interface,我正在使用openCV,在我更改软件包名称之前,它工作得很好。我在google和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.nativeAp

我正在使用openCV,在我更改软件包名称之前,它工作得很好。我在google和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) 

根据@lockcmpxchg8b的评论,我去寻找javah的参考资料&找到了我找到答案的地方

要解决这个问题,您需要检查make文件(可能位于
app/src/main/jni/Android.mk
)。它应该包含像
LOCAL\u MODULE
LOCAL\u CFLAGS
LOCAL\u SRC\u文件
这样的值


本地_SRC_文件将列出一些.cpp文件。在名为
Java\u old\u package\u name\u editor\u filter\u PhotoProcessing\u nativeApplyFilter
&将
old\u package\u name
更改为新包的文件中查找函数。

JNI使用
javah
工具从Java类生成本机函数的名称。生成的名称包括包、类和方法名称,包括参数和返回类型。因此,如果更改了包的名称,则必须重新运行
javah
,然后必须更改所有本机函数的实现以匹配新生成的头文件。这就是为什么您会遇到不满意的链接错误…Java VM无法在您的本机中找到方法。因此,请使用正确的名称来实现您的类的本机方法。我不确定是否值得为包重命名。法律要求您披露您的项目使用OpenCV(per),因此我不确定您将其嵌入到您自己的软件包中的动机。在我的情况下,我在项目中没有找到任何Android.mk,但我在.cpp文件中找到了一些函数,其中包含
Java\u old\u package\u name…
。重命名它们后,项目如期运行。另外,对我来说,函数名是折叠的,所以我一开始没有注意到它们。