使用flatter从Android上的本机编译共享库调用函数
我已经按照上的说明进行了操作,并使用c abi成功编译了cpp,并使用dart:ffi在使用CMake集成的模拟android设备上对其进行了调用。这将编译一个使用flatter从Android上的本机编译共享库调用函数,android,c++,flutter,dart,ffi,Android,C++,Flutter,Dart,Ffi,我已经按照上的说明进行了操作,并使用c abi成功编译了cpp,并使用dart:ffi在使用CMake集成的模拟android设备上对其进行了调用。这将编译一个lib*.so文件,将其与颤振包一起复制,并将其放置在颤振代码中,以便我可以轻松地访问它 然而,假设我已经有了一个已编译的共享库,或者是我自己编译的,或者是在使用CMake之外的某个地方可以使用Android及其给定的cpu架构 如何将其添加到颤振系统中,使其复制并放置在“可解析”位置,与添加时的方式相同 android { //...
lib*.so
文件,将其与颤振包一起复制,并将其放置在颤振代码中,以便我可以轻松地访问它
然而,假设我已经有了一个已编译的共享库,或者是我自己编译的,或者是在使用CMake之外的某个地方可以使用Android及其给定的cpu架构
如何将其添加到颤振系统中,使其复制并放置在“可解析”位置,与添加时的方式相同
android {
//...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
是否将目标与包一起添加到CMake文件中
有关详细信息,我已使用cargo ndk和正确的achitecture在rust中编译了一个共享库,但我只在尝试使用`ffi.DynamicLibrary.open(…)打开它时出错,无论我尝试了什么
我猜这很简单,但我想不出一个办法
我的dart
ffi.DynamicLibrary
针对Windows本机库的代码链接工作正常。因此,这似乎主要是一个Android/flatter/gradle打包问题。要添加预编译的共享库,您需要将其放入Android/app/src/main/jniLibs/X
文件夹,其中X是架构名称(armeabi-v7a或arm64-v8a)。虽然它是库的默认路径,但我不完全确定是否有必要,但在build.gradle中将此文件夹指定为源集可能更安全:
之后,您应该能够使用Dart的
DynamicLibrary.open
和Java的System.loadLibrary
将.so文件添加到android/app/src/main/jniLibs/x86
中来加载它。当仅仅将文件添加到android/app/src/main/jniLibs/mylib时,所以没有复制它,使用adb find进行了测试。
android {
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}