Android studio 如何在NDK项目(Android Studio)中导入和使用.so文件
我正在尝试导入并使用android studio NDK项目中的.so文件。我已经阅读了android studio的文档、不同的博客以及StackOverflow上的答案,但是没有一个对我有用,因为大多数都是过时的(3-4年前写的或问的)。也无法按照文档进行操作 请帮忙 (我假设.so文件是使用Android NDK为Android构建的。如果不是,这将不起作用,您将需要源代码来使用Android NDK重建.so文件) 假设您有一个名为native lib的库,它是为ARMv7A体系结构构建的,您已经将它放在app/prebuild_libs/armeabi-v7a/中 app/build.gradle:Android studio 如何在NDK项目(Android Studio)中导入和使用.so文件,android-studio,android-ndk,.so,libnodave,Android Studio,Android Ndk,.so,Libnodave,我正在尝试导入并使用android studio NDK项目中的.so文件。我已经阅读了android studio的文档、不同的博客以及StackOverflow上的答案,但是没有一个对我有用,因为大多数都是过时的(3-4年前写的或问的)。也无法按照文档进行操作 请帮忙 (我假设.so文件是使用Android NDK为Android构建的。如果不是,这将不起作用,您将需要源代码来使用Android NDK重建.so文件) 假设您有一个名为native lib的库,它是为ARMv7A体系结构构建
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\u com\u example\u bar\u MyClass\u 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)
我们怎么知道.so文件是为android构建的?如果.so文件不是为android构建的,我们如何为android创建一个呢?非常感谢你的支持help@vardanKaushik:嗯,你是从哪儿弄来的?如果它不是来自某个Android项目,那么它很可能不适合在Android上使用。在这种情况下,您将需要库的源代码。我想使用用于s7 plc和android之间通信的libnodave库,我下载了它的源代码,其中包含一个.so文件,但它没有指定此.so文件是否为android构建