概述:
使用 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;
}
说明:
- 单纯使用 Dart 调用动态链库是完全没问题的,包括函数返回类型是*char,这是在 Windows 上测试的。
- 将动态链库使用到 Flutter 上时,只有返回为 int 等数值类型的才没问题,调用返回*char 类型的函数时会闪退;这是你需要为我解决的。
- 先到先得,可以加点价。
相关资料:
-
我自己写的 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
