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()}")
}
}
}
我正在尝试将 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()}")
}
}
}