Добавить .so (готовую) библиотеку из другого каталога в APK - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь включить мою библиотеку .so из другого каталога.Компиляция моего проекта работает нормально.Но когда я запускаю его, он дает мне

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [DexPathList [[zip-файл »/data/app/com.company.gimikapp-2/base.apk "], nativeLibraryDirectories = [/ data / app / com.company.gimikapp-2 / lib / arm, / vendor / lib, / system / lib]]] не удалось найти" libtheprebuiltlib.so "

Общие решения, которые я вижу в SO, таковы:

sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

Пробовал оба

jniLibs.srcDirs = ['C:\\svn\\sys_libs']

и

jniLibs.srcDirs = ['C:/svn/sys_libs']

Как вы на самом деле указываете этов другой каталог за пределами вашего проекта Android?

Это мой CMakeList.txt:

cmake_minimum_required(VERSION 3.4.1)
add_library( native-lib
            SHARED
            src/main/cpp/source/native-lib.cpp )
add_library(theprebuiltlib SHARED IMPORTED)
set_target_properties(theprebuiltlib PROPERTIES IMPORTED_LOCATION
            C:/svn/sys_libs/libtheprebuiltlib.so)
target_include_directories(
            native-lib PRIVATE
            src/main/cpp/source/
            C:/svn/sys_includes/)
find_library( log-lib
            log)
target_link_libraries( native-lib
            theprebuiltlib
            ${log-lib})

А вот моя настройка gradle для моего JNI:

android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
            ndk {
                abiFilters 'armeabi'
            }
        }
        ...
    }
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['C:/svn/sys_libs']
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Для NDK r16 и плагина Gradle v3.1.2 приведено пошаговое решение (благодаря @Alex Cohn).

  1. Установите android.sourceSets.main.jniLibs.srcDir, чтобы указать местоположениеexternal .so

    android {
        sourceSets {
            main { 
                jniLibs.srcDir 'C:/svn/sys_libs' 
            }
       }
    }
    
  2. Убедитесь, что ваш внешний .so находится по указанному выше пути (шаг 1), с добавлением правильной архитектуры.В моем случае это armeabi, таким образом, мой .so находится в

    C:/svn/sys_libs/armeabi/libtheprebuiltlib.so
    
  3. Перемещение ndk из android.defaultConfig.externalNativeBuild.ndk в android.defaultConfig.ndk как и так

    android {
        defaultConfig {
            ndk {
                abiFilters 'armeabi'
            }
        }
    }
    
  4. Убедитесь, что CMakeLists.txt указывает на полный путь с правильной архитектурой.

    set_target_properties(theprebuiltlib PROPERTIES IMPORTED_LOCATION
            C:/svn/sys_libs/armeabi/libtheprebuiltlib.so)
    
0 голосов
/ 10 июня 2018

По-видимому, у вас установлен NDK r17 и плагин Android v.3.1.0 или выше (мы не видим этого в опубликованном фрагменте build.gradle).

Но вы установили abiFilters до armeabi, который был отброшен.Вы должны установить его на armeabi-v7a и убедиться, что libtheprebuiltlib.so также построен для этого ABI, или вы можете загрузить старую версию NDK и в build.gradle зависимости установить

classpath 'com.android.tools.build:gradle:3.0.1'

Вы можете принудительно установить дескриптор последнего плагина armeabi, если вы установите его явно:

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi'
        }
    }
}

(в вашем скрипте он находится под android.defaultConfig.externalNativeBuild.ndk , поэтому не имеет никакого эффекта).

Одна ошибка в вашем build.gradle , она должна читать

android {
  sourceSets {
     main { 
       jniLibs.srcDir 'C:/svn/sys_libs' 
     }
   }
}

, когда у вас есть файл C:\svn\sys_libs\armeabi\libtheprebuiltlib.so.Но это не объясняет, почему cmake не работает должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...