【问题标题】:NDK: how include *.so files in AndroidStudioNDK:如何在 Android Studio 中包含 *.so 文件
【发布时间】:2015-10-16 07:26:35
【问题描述】:

我有 libs jar 和 *.so。我在教程中创建了 Eclipse 项目(对于这个库)。我现在在 Android Studio 中做项目,但系统找不到 *.so 文件。我在这个 - Include .so library in apk in android studio 。我的应用在 so 库中找不到功能。如何找到它们? 日志:

10-16 12:16:55.965: W/dalvikvm(4386): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/atol/drivers/fptr/IFptrNative;
10-16 12:16:55.965: W/dalvikvm(4386): threadid=1: thread exiting with uncaught exception (group=0x41869438)
10-16 12:16:55.976: E/AndroidRuntime(4386): FATAL EXCEPTION: main
10-16 12:16:55.976: E/AndroidRuntime(4386): java.lang.ExceptionInInitializerError

使用 JAR 库创建对象时发生错误。她反过来戳 *.so 文件,但要找到她需要的东西。谁应该受到责备,该怎么办?

【问题讨论】:

标签: android android-studio android-ndk


【解决方案1】:

三个选项:

一个

将您的 *.SO 库复制到您的 libs 文件夹并将其放在 build.gradle 上:

dependencies
        {
    compile fileTree(include: ['*.jar'], dir: 'libs')
}

两个

src/main/jniLibs 上创建一个新文件夹并将其写入您的build.gradle

android {
    //Another code 
    sourceSets {
        main {         
            jniLibs.srcDirs = ['src/main/jnilibs']          
        }
        //Another code 
    }//sourceSets tag close
}//Android tag close

那里

src/main/jniLibs 上创建一个新文件夹并将其写入您的build.gradle

//Another code....

    dependencies
    {
          compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
    }//end dependencies


    task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
        destinationDir file("$buildDir/native-libs")
        baseName 'native-libs'
        from fileTree(dir: 'src/main/jnilibs', include: '**/*.so')
        into 'lib/'
    }
    
    tasks.withType(JavaCompile)
     {
          compileTask -> compileTask.dependsOn(nativeLibsToJar)
     }

【讨论】:

  • 不起作用。我使用库 JAR 创建了一个对象,但它适用于 .so 库。在 Eclipse 中一切正常。 AndroidStudio能否生成不正确的链接.so库或JAR文件库绑定到Eclipse中的项目结构?
  • 非常感谢。在寻找解决方案一周后,这救了我。原来在我的 sourceSets.main.jniLibs.srcDirs 中只有 ["libs"]。将其更改为 ['src/main/jniLibs'] 使其工作。
【解决方案2】:

当前解决方案

创建文件夹 project/app/src/main/jniLibs,然后将您的 *.so 文件放在该位置的 abi 文件夹中。例如,

project/
├──libs/
|  └── *.jar       <-- if your library has jar files, they go here
├──src/
   └── main/
       ├── AndroidManifest.xml
       ├── java/
       └── jniLibs/ 
           ├── arm64-v8a/                       <-- ARM 64bit
           │   └── yourlib.so
           ├── armeabi-v7a/                     <-- ARM 32bit
           │   └── yourlib.so
           └── x86/                             <-- Intel 32bit
               └── yourlib.so

已弃用的解决方案

在您的模块 gradle.build 文件中添加两个代码 sn-ps 作为依赖项:

compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
How to create this custom jar:

task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}


【讨论】:

  • 记得在你的build.gradle sourceSets中包含这个{ main { jniLibs.srcDirs = ['src/main/jniLibs'] } } 如果[方括号]之间的内容不同,Android Studio不会将 so 库正确加载到 APK 中,并且可能会跳过您需要的一些库。这让我头痛了一整周。
【解决方案3】:

您需要将 .so 文件放在名为 lib 的文件夹中(它不是 lib,应该是 lib)。它应该与 APK 文件中的结构相同。

结构

Project:
|--lib:
|--|--armeabi:
|--|--|--.so files.

然后是 armeabi 文件夹,其中插入所有 .so 文件。然后将文件夹压缩为 .zip。将 .zip 文件重命名为 armeabi.jar 并添加该行 compile fileTree(dir: 'libs', include: '*.jar') 进入 gradle 的构建文件中的dependencies {}

有关更多信息和替代方法,请参阅This answerThis answer

【讨论】:

  • 不起作用。我使用库 JAR 创建了一个对象,但它适用于 .so 库。在 Eclipse 中一切正常。 AndroidStudio能否生成不正确的链接.so库或JAR文件库绑定到Eclipse中的项目结构?
【解决方案4】:

在 src/main 文件夹中创建文件夹名称“jniLibs”,并添加包含“*.so”文件的所有文件夹,然后同步并运行您的应用程序。无需其他步骤。

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 2023-03-17
    • 1970-01-01
    • 2016-02-10
    • 2015-03-02
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多