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

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

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

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)
Другие вопросы по тегам