Как импортировать и использовать файл .so в проекте NDK (Android Studio)

Я пытаюсь импортировать и использовать файл .so в проекте Android Studio NDK. Я прочитал документацию студии Android, другой блог и ответы на StackOverflow, но ни один из них не работает для меня, потому что большинство из них устарели (написаны или заданы 3-4 года назад). Также не может следовать документации.

Пожалуйста помоги!


person vardan Kaushik    schedule 19.07.2018    source источник


Ответы (1)


(Я предполагаю, что файл .so создан для Android с использованием Android NDK. Если нет, это не сработает, и вам понадобится исходный код для восстановления файла .so с помощью Android NDK)

Допустим, у вас есть библиотека с именем native-lib, созданная для архитектуры ARMv7A, и вы поместили ее в app/prebuilt_libs/armeabi-v7a/.

приложение/build.gradle:

android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets.main {
        jniLibs.srcDirs = ['prebuilt_libs']
    }

приложение/CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

add_library(lib_native SHARED IMPORTED)
set_target_properties(lib_native PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/${ANDROID_ABI}/libnative-lib.so)

Если библиотека предназначена для использования из Java

CallNative.java:

package com.example.foo;  // !! This must match the package name that was used when naming the functions in the native code !!


public class CallNative {  // This must match the class name that was used when naming the functions in the native code !!
    static {
        System.loadLibrary("native-lib");
    }
    public native String myNativeFunction();
}

Например, если в нативной библиотеке есть функция JNIEXPORT jstring JNICALL Java_com_example_bar_MyClass_myNativeFunction, то класс Java должен называться MyClass и находиться в пакете com.example.bar.


Если библиотека предназначена для использования другими собственными библиотеками

Вам понадобится заголовочный файл (*.h) для библиотеки. Если у вас его нет, вам придется самостоятельно придумать, как его написать.

Затем добавьте это в свой CMakeLists.txt:

set_target_properties(lib_native PROPERTIES INCLUDE_DIRECTORIES directory/of/header/file)

И для другой нативной библиотеки, использующей libnative-lib.so:

target_link_libraries(other_native_lib lib_native)
person Michael    schedule 19.07.2018
comment
Как мы можем узнать, что файл .so создан для Android? и если файл .so не является сборкой для Android, как мы можем создать его для Android? и большое спасибо за вашу помощь - person vardan Kaushik; 19.07.2018
comment
@vardanKaushik: Ну, откуда ты это взял? Если оно пришло не из какого-то Android-проекта, то, скорее всего, оно не подойдет для использования на Android. В этом случае вам понадобится исходный код библиотеки, и соберите его в обычным способом. - person Michael; 19.07.2018
comment
Я хочу использовать библиотеку libnodave, которая используется для связи между s7 plc и android, я скачал ее исходный код, и он содержит файл .so, но ничего не указывает, что этот файл .so создан для Android или нет. - person vardan Kaushik; 19.07.2018