(Я предполагаю, что файл .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