Android 加载外部库时应用退出

Android app exit while loading external library

我正在尝试将 opencv4 添加到我的 android 应用程序,并按照 this post.

中的所有操作

我在下面的 kotlin 文件的开头添加了 System.loadLibrary

class MainActivity : AppCompatActivity() {
    companion object {
        init {
            System.loadLibrary("opencv_java4")
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) { }

但是应用程序在启动后退出并显示以下内容:

09/22 16:08:04: Launching 'app' on Pixel 3a API 29.
$ adb shell am start -n "hasan.tts_mobile/hasan.tts_mobile.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Waiting for process to come online...
Timed out waiting for process to appear on Pixel_3a_API_29 [emulator-5554].

多亏了这个 answer,看起来 opencv 4 中发生了一些变化,所有现有的教程都在谈论将 java 文件夹导入为模块,而实际上需要的是导入的是 skd 文件夹本身。

您可以使用 JavaCV,它是 OpenCV 的包装器,或者手动执行 OpenCV,如下所示:

1- 从 here 下载 OpenCV – 4.1.1 用于 Android

2-解压文件夹,会解压到OpenCV-android-sdk,里面包含以下内容:

Hasans-Air:OpenCV-android-sdk hasan$ ls
LICENSE     README.android  samples     sdk

3- 在 Android Studio

前往您的项目

4- 文件 -> 新建 -> 导入模块

5- Select第2点解压后的文件夹中的sdk文件夹,如图建议module name:sdk但可以重命名为:sdkOpenCV4,别忘了名字前面的:

6-右击app、select、Open Module Settings、select依赖项,然后点击app模块,在Declared Dependencies 点击 + 然后你会在那里看到 OpenCV 模块,点击添加,点击 Apply 然后 Add:

7- 从 OpenCV SDK 复制 sdk/native/libs 文件夹,然后转到 tour application 文件夹 src/main 并将其粘贴到其中,然后将 libs 文件夹重命名为 jnilibs,这样在你的应用程序 src/main 文件夹中 你将拥有:

8- 在 OnCreate 中您可以在开始使用前添加一个检查:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val ocvLoaded = OpenCVLoader.initDebug()
        if (ocvLoaded) {
            Toast.makeText(
                this@MainActivity, "OpenCV loaded",
                Toast.LENGTH_SHORT
            ).show()
        } else {
            Toast.makeText(
                this@MainActivity, "Unable to load OpenCV",
                Toast.LENGTH_SHORT
            ).show()
            Log.d("openCV", "loader: ${OpenCVLoader.initDebug()}")
        }
    }
}