我正在尝试在 android studio NDK 项目中导入和使用 .so 文件。我已经阅读了 android studio 的文档、不同的博客和 StackOverflow 上的答案,但没有一个对我有用,因为它们中的大多数都已过时(3-4 年前写或问过)。也无法遵循文档。
请帮忙!
我正在尝试在 android studio NDK 项目中导入和使用 .so 文件。我已经阅读了 android studio 的文档、不同的博客和 StackOverflow 上的答案,但没有一个对我有用,因为它们中的大多数都已过时(3-4 年前写或问过)。也无法遵循文档。
请帮忙!
(我假设 .so 文件是使用 Android NDK 为 Android 构建的。如果不是,这将不起作用,您需要使用 Android NDK 重建 .so 文件的源代码)
假设您有一个名为 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)