咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

Android Ndk常见报错

1. 运行时找不到so文件

具体表现为:已经在libs目录添加了所有平台的so文件,但是运行是依然提示找不到so文件。

如:

1
2
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.ijkplayer-CyD2mFQ8g6fyehi-g_1ALQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.ijkplayer-CyD2mFQ8g6fyehi-g_1ALQ==/lib/arm64, /system/lib64, /vendor/lib64]]] couldn't find "libijkffmpeg.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:1012)

问题:
编译时,jniLibs默认的路径是 /app/src/main/jniLibs ,如果so文件放在 /app/libs 需指定目录。

解决:

  1. so文件放置在 /app/src/main/jniLibs (推荐)

  2. 指定工程的so文件路径
    build.gradle

    1
    2
    3
    4
    5
    6
    7
    8
    android {
    ...
    sourceSets {
    main {
    jniLibs.srcDirs = ['libs']
    }
    }
    }

2. AS提示ndk版本不匹配

编译是出现错误:

1
No version of NDK matched the requested version 21.0.6113669. Versions available locally: 21.3.6528147

本地是:21.3.6528147版本,需要匹配21.0.6113669版本。

问题:AS没有配置NDK路径

解决:给工程配置NDK-21.3.6528147版本的路径

  1. 配置本地NDK(已经弃用)
    local.properties

    1
    2
    ndk.dir=D\:\\android_sdk_4\\ndk\\21.3.6528147
    sdk.dir=D\:\\android_sdk_4
  2. 指定NDK版本为本地的版本(推荐)

build.gradle

1
2
3
android {
ndkVersion '21.3.6528147'
}

3. 不识别 ‘uint32_t’

IDE提示红色错误:Unknown type name ‘uint32_t’,这个错误是由于我把CPP的代码放进一个Library Module(手动创建CMakeLists.txt等编译环境),而Library Module没有include 到Ndk C++库:“\toolchains\llvm\prebuild\windows-x86_64” .
更正的方法就是将CPP代码放在 Phone Module 中编译,创建项目选择 Phone Module 时,选择 Native C++ 会自动include Ndk C++库。

用 Android Studio 创建Library Module ,是不能创建一个C++的Module的。