Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用flatter从Android上的本机编译共享库调用函数_Android_C++_Flutter_Dart_Ffi - Fatal编程技术网

使用flatter从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 { //...

我已经按照上的说明进行了操作,并使用c abi成功编译了cpp,并使用dart:ffi在使用CMake集成的模拟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']
        }
    }        
}