我正在尝试在android studio NDK项目中导入和使用.so文件。我已经阅读了android studio的文档,不同的博客以及有关StackOverflow的答案,但没有一个对我有用,因为其中大多数已过时(3-4年前写或问过)。也无法遵循文档。
请帮助!
答案 0 :(得分:1)
(我假设.so文件是使用Android NDK为Android构建的。如果不行,这将无法正常工作,您将需要使用Android NDK重建.so文件的源代码)
假设您有一个名为native-lib的库,该库是为ARMv7A架构构建的,并将其放置在app / prebuilt_libs / armeabi-v7a /中。
app / build.gradle:
android {
...
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a"
}
}
...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
sourceSets.main {
jniLibs.srcDirs = ['prebuilt_libs']
}
app / 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)