【问题标题】:why my native library is not loaded?为什么我的本机库没有加载?
【发布时间】:2015-03-25 04:33:51
【问题描述】:

我已将 Gradle 标记添加到此线程,因为我觉得我的 build.gradle 文件缺少所需的配置。下面是我的文件的副本。我遇到的问题是我不知道为什么我的共享库文件没有进入我的 apk。我想我通过阅读 Gradle 手册在这个文件中看到了我需要什么的迹象,但我想确定一下。

sansari@ubuntu:~/AndroidStudioProjects/ThirdNDK/app$ more build.gradle 
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.sansari.thirdndk"
        minSdkVersion 19
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk
                {
                    moduleName "HelloJNI"
                }
    }
    sourceSets.main
            {
                jni.srcDirs = [] // ndk-build.cmd needs to be invoked from command line
                jniLibs.srcDirs '/src/main/libs'
            }
    productFlavors
            {
                x86
                        {
                            ndk
                                    {
                                        abiFilter "x86"
                                    }
                        }

    armv7a
            {
                ndk
                        {
                            abiFilter "armeabi-v7a"
                        }
            }
                arm {
                    //flavorDimension "abi"
                    ndk
                            {
                                abiFilter "armeabi"
                                versionCode = 1;
                            }
                    }
            }
buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
}

我正在 Android Studio 中尝试原生代码项目,但出现以下错误。但我不知道加载程序为什么要在那个目录中查找。或者为什么该文件夹被称为 com.example.sansari.thiredndk-1。我刚刚将我的项目称为thirdndk。我不确定如何添加 -1。我想知道如何解决这个问题,并了解加载程序为什么要在该目录中查找?我的 /libs 文件夹在项目的主目录中。

java.lang.UnsatisfiedLinkError: Couldn't load HelloJNI from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.example.sansari.thirdndk-1.apk,libraryPath=/data/app-lib/com.example.sansari.thirdndk-1]: findLibrary returned null

@Preethi。谢谢;我去看看。我打字很快。

@Preethi 或其他任何人;我似乎对此没有任何运气。这是apk:

感谢大家的帮助。它终于奏效了。我用谷歌搜索了“如何使用 gradle 将库文件添加到 apk”,然后出现了这个小宝石:“在 android studio 的 apk 中包含 .so 库 [重复]”它在 stackoverflow 上。我不确定我是否有权发布网址。其中,cmets 关于早期版本的 Gradle 中包含库的错误。其中的一个链接有一个关于使用 jniLibs 文件夹作为放置共享库的目录的评论。所以我抓住机会将我所有的共享库文件从 libs 复制到 jniLibs。我创建了 jniLibs 并复制了文件,瞧。再次感谢大家。你们真棒。

【问题讨论】:

  • 如果您的 android.mk 文件有问题,通常会发生这种情况
  • 你在运行 ndk-build 时是否遇到任何错误?
  • 带有-1 的文件夹名称超出您的控制范围,完全可以。您向我们展示的文件是您的 Android.mk,除了 cmets,它看起来都很好。但是您使用的是 Android Studio,它没有完整的 NDK 集成。为什么你认为你的原生代码完全被编译了?
  • 很好,你已经构建了库。现在的问题是它们是否被打包到 APK 中。只需在 APK 文件上使用 unzip -l 即可检查。
  • 如果自定义共享库不在您的 APK 中,那么它肯定不会在运行时加载。专注于弄清楚为什么它没有进入包装。

标签: android-studio gradle android-ndk java-native-interface native


【解决方案1】:

如果您的 .so 文件现在是在 libs/<abi> 中生成的,那么剩下的唯一步骤就是让 Android Studio 集成来自 libs 文件夹的这些文件。

默认情况下,它会在 jniLibs 中查找 .so 文件,但您可以将其更改为集成 libs 文件夹中的文件:

android {
    ...
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
    }
}

【讨论】:

    【解决方案2】:

    尝试文件 -> 使缓存无效/重新启动。

    它对我有用。

    【讨论】:

      【解决方案3】:

      我也有类似的问题。 该 apk 用于在 Ubuntu 中正确构建,但在 Windows 中,该 apk 缺少 lib 文件夹。

      显然错误是命名jniLibs 文件夹。我将其命名为jnilibs,全部小写,这会导致问题。我已将其更正为 jniLibs,并且 apk 在 Windows 上正确构建。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-12-24
        • 2012-01-09
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 2013-06-16
        相关资源
        最近更新 更多