在 android studio 使用 .So 文件
Use .So file in android studio
我正在为 device 开发一个应用程序,它本身有一个 SDK
。
当我尝试将其 SDK 作为库导入我的应用程序时,我会收到如下错误:
E/MultiWindowProxy: getServiceInstance failed!
E/MultiWindowProxy: getServiceInstance failed!
E/AndroidRuntime: FATAL EXCEPTION: Thread-571
Process: cards.mena.app, PID: 9484
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/cards.mena.app-2/base.apk"],nativeLibraryDirectories=[/data/app/cards.mena.app-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libserial_port.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
at java.lang.System.loadLibrary(System.java:1076)
at android_serialport_api.SerialPort.<clinit>(Unknown Source)
at com.rt.printerlibrary.driver.serialport.ComDriver.a(Unknown Source)
at com.rt.printerlibrary.driver.serialport.ComDriver.run(Unknown Source)
我将 .Jar
文件和 .so
放入我的应用程序的 libs
文件夹中,如下所示:
这是我的 Gradle
文件:
android {
compileSdkVersion 28
defaultConfig {
applicationId "cards.mena.app"
minSdkVersion 21
targetSdkVersion 28
versionCode 10002
versionName "1.0.2"
setProperty("archivesBaseName", "MenaCards-v$versionName")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
sourceSets {
main {
// manifest.srcFile 'AndroidManifest.xml'
jniLibs.srcDirs = ['libs']
// java.srcDirs = ['src']
// resources.srcDirs = ['src']
assets.srcDirs = ['assets']
}
}
}
androidExtensions {
experimental = true
}
kapt {
generateStubs = true
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.anko:anko-commons:0.10.8"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "com.android.support:design:$supportLibraryVersion"
/*----------------/ Printer Libs \---------------------------*/
implementation files('libs/printer_library_ap02.jar')
更新:
我将 Gradle 表单 3.5.0 降级为 2.3.2,我的应用程序现在可以正常工作了!
那么问题是Gradle!这与我有什么关系?
我将我的 .so 文件放在 src > main > jniLibs
和体系结构相关的子文件夹 arm64-v8a, armeabi-v7a, ...
中。不需要额外的配置。也许这对你有帮助。
我找到了问题及其答案。
问题是关于 Gradle 版本的,我不得不添加这一行:
defaultConfig {
ndk {
abiFilters 'armeabi'
}
}
我找到了解决方案,您不必将其作为 gradle 依赖项添加到 gradle 应用程序文件中。
android{
sourceSets {
main {
jniLibs.srcDirs = ['libs']
assets.srcDirs = ['assets']
}
}
}
我遇到了同样的问题,正如@Ehsan 所建议的那样。
不过我想指出一点,您不需要降级 gradle。
如果您想将 .so 文件放在 libs 文件夹中,则需要添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
assets.srcDirs = ['assets']
}
}
如果您已经将它们添加到 jniLibs 文件夹中,则不需要。
然后添加
defaultConfig {
ndk {
abiFilters 'armeabi'
}
}
一切顺利。
我正在为 device 开发一个应用程序,它本身有一个 SDK
。
当我尝试将其 SDK 作为库导入我的应用程序时,我会收到如下错误:
E/MultiWindowProxy: getServiceInstance failed!
E/MultiWindowProxy: getServiceInstance failed!
E/AndroidRuntime: FATAL EXCEPTION: Thread-571
Process: cards.mena.app, PID: 9484
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/cards.mena.app-2/base.apk"],nativeLibraryDirectories=[/data/app/cards.mena.app-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libserial_port.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
at java.lang.System.loadLibrary(System.java:1076)
at android_serialport_api.SerialPort.<clinit>(Unknown Source)
at com.rt.printerlibrary.driver.serialport.ComDriver.a(Unknown Source)
at com.rt.printerlibrary.driver.serialport.ComDriver.run(Unknown Source)
我将 .Jar
文件和 .so
放入我的应用程序的 libs
文件夹中,如下所示:
这是我的 Gradle
文件:
android {
compileSdkVersion 28
defaultConfig {
applicationId "cards.mena.app"
minSdkVersion 21
targetSdkVersion 28
versionCode 10002
versionName "1.0.2"
setProperty("archivesBaseName", "MenaCards-v$versionName")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
sourceSets {
main {
// manifest.srcFile 'AndroidManifest.xml'
jniLibs.srcDirs = ['libs']
// java.srcDirs = ['src']
// resources.srcDirs = ['src']
assets.srcDirs = ['assets']
}
}
}
androidExtensions {
experimental = true
}
kapt {
generateStubs = true
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.anko:anko-commons:0.10.8"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "com.android.support:design:$supportLibraryVersion"
/*----------------/ Printer Libs \---------------------------*/
implementation files('libs/printer_library_ap02.jar')
更新: 我将 Gradle 表单 3.5.0 降级为 2.3.2,我的应用程序现在可以正常工作了!
那么问题是Gradle!这与我有什么关系?
我将我的 .so 文件放在 src > main > jniLibs
和体系结构相关的子文件夹 arm64-v8a, armeabi-v7a, ...
中。不需要额外的配置。也许这对你有帮助。
我找到了问题及其答案。
问题是关于 Gradle 版本的,我不得不添加这一行:
defaultConfig {
ndk {
abiFilters 'armeabi'
}
}
我找到了解决方案,您不必将其作为 gradle 依赖项添加到 gradle 应用程序文件中。
android{
sourceSets {
main {
jniLibs.srcDirs = ['libs']
assets.srcDirs = ['assets']
}
}
}
我遇到了同样的问题,正如@Ehsan 所建议的那样。
不过我想指出一点,您不需要降级 gradle。
如果您想将 .so 文件放在 libs 文件夹中,则需要添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
assets.srcDirs = ['assets']
}
}
如果您已经将它们添加到 jniLibs 文件夹中,则不需要。
然后添加
defaultConfig {
ndk {
abiFilters 'armeabi'
}
}
一切顺利。