使用 C 打包为 Android 的 C-shar(so)动态链库,然后使用 Fltter 的 ffi 调用。现在我实现了函数为 int 类型的相互调用,但是 string(*char)始终有问题。
将 C 程序打包为 so 动态链库,并能在 Flutter 项目上正常使用,仅 Android 即可,使用 CMake ; C 程序:
#include <stdio.h>
#include <stdlib.h>
int Hello(){
return 233;
}
char *World(){
char *r = "1234";
return r;
}
char *Test(char *str)
{
return str;
}
我自己写的 ffi 类,可供参考:链接: https://pan.baidu.com/s/1z-ooHzgkbM2SkzWrkJs4eA 提取码: 9awt
我打包的动态链库,如果相信没问题可以直接用:链接: https://pan.baidu.com/s/16lZ8NwUexXJ3rpFcCxZwLw 提取码: c8s7
打包命令:
D:\Desktop\test>E:\android-ndk-r22-windows-x86_64\android-ndk-r22\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android24-clang -shared -o mylib.so -Xlinker -soname=mylib.so -lm mylib.c
D:\Desktop\test>E:\android-ndk-r22-windows-x86_64\android-ndk-r22\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-nm.exe ./mylib.so
00000000000014f4 t __atexit_handler_wrapper
U __cxa_atexit
U __cxa_finalize
00000000000025b0 d __dso_handle
00000000000025b0 d __dso_handle_const
00000000000014ec t __emutls_unregister_key
00000000000004dc r __FRAME_END__
00000000000014e0 t __on_dlclose
00000000000014f0 t __on_dlclose_late
U __register_atfork
00000000000025c8 d _DYNAMIC
0000000000001500 t atexit
0000000000001528 T Hello
0000000000000290 r ndk_build_number
0000000000000250 r ndk_version
0000000000000238 r note_android_ident
000000000000024c r note_data
00000000000002d0 r note_end
0000000000000244 r note_name
000000000000151c t pthread_atfork
000000000000154c T Test
0000000000001530 T World
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.