flutter使用C代码库—IOS篇
首页 专栏 ios 文章详情
0

flutter使用C代码库—IOS篇

Hero 发布于 1 月 18 日

1) 和原生IOS开发的技术一样,编译出.a静态库(下文称之为libtclib.a,包含简单的native_add函数)。

图片.png

2) 确认flutter的dart插件产生的项目的IOS部分使用obj-c语言:

图片.png

3) 使用xcode打开Runner.xcworkspace,在linkBinaryWithLibraries里把libtclib.a包含进来,还需要在LibarySearchPaths把libtclib.a的路径放进去。

4) main.dart里的内容:

内容和上一篇《flutter使用C代码库—Android篇》一样。

编译运行,会发现,编译正常通过,但运行时,报错了,报告找不到相应的native_add这个symbol。

我偶然在AppDelegate.m文件中测试了对native_add的调用:

图片.png

然后编译运行,意外发现整个APP运行正常了!

分析原因:如果没有在AppDelegate.m里对native_add的调用,那么xcode的编译器(注意是编译obj-c的,不是flutter的编译器)会认为native_add没有用,从而不链接进可执行文件中(我还没有弄明白xcode的编译器是基于单个函数、还是分段、还是基于静态库文件来决定链接的。比如,同一个静态库有两个函数A和B,如果A在AppDelegate.m被调用,B没有,那么xcode链接时,是只链接A还是整个静态库都链接进去?),这是因为xcode的编译器是不知道在main.dart调用了native_add的。等到main.dart去lookup这个native_add函数symbol的时候,自然就找不到了。

所以,为了保险起见,在flutter中需要直接用到的函数(间接用到的函数没关系,xcode会自动分析然后链接进来),在AppDelegate.m中先调用一遍。但是如果真的调用一遍,耗时耗电不说,还会产生副作用,为此,用一点技巧:
图片.png

先写一个touch函数,这个touch函数可以放在静态库中,也可以放在AppDelegate.m中,然后在AppDelegate.m中,这么调用一下:

touch_api(0);

这样,等于欺骗了一把xcode编译器,让他误以为我们的应用中调用了相关的函数,就把相关的函数链接进来了。

注意,如果这样是不行的:
图片.png

xcode编译器还是有点智商的,它会分析出并没有真正调用native_times和native_add两个函数,所以不会去链接。但如果变成上面的调用方式,就可以骗过xcode编译器了。

ios c flutter
阅读 49 更新于 1 月 18 日
赞 收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
Hero
1 声望
0 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
Hero
1 声望
0 粉丝
关注作者
宣传栏

1) 和原生IOS开发的技术一样,编译出.a静态库(下文称之为libtclib.a,包含简单的native_add函数)。

图片.png

2) 确认flutter的dart插件产生的项目的IOS部分使用obj-c语言:

图片.png

3) 使用xcode打开Runner.xcworkspace,在linkBinaryWithLibraries里把libtclib.a包含进来,还需要在LibarySearchPaths把libtclib.a的路径放进去。

4) main.dart里的内容:

内容和上一篇《flutter使用C代码库—Android篇》一样。

编译运行,会发现,编译正常通过,但运行时,报错了,报告找不到相应的native_add这个symbol。

我偶然在AppDelegate.m文件中测试了对native_add的调用:

图片.png

然后编译运行,意外发现整个APP运行正常了!

分析原因:如果没有在AppDelegate.m里对native_add的调用,那么xcode的编译器(注意是编译obj-c的,不是flutter的编译器)会认为native_add没有用,从而不链接进可执行文件中(我还没有弄明白xcode的编译器是基于单个函数、还是分段、还是基于静态库文件来决定链接的。比如,同一个静态库有两个函数A和B,如果A在AppDelegate.m被调用,B没有,那么xcode链接时,是只链接A还是整个静态库都链接进去?),这是因为xcode的编译器是不知道在main.dart调用了native_add的。等到main.dart去lookup这个native_add函数symbol的时候,自然就找不到了。

所以,为了保险起见,在flutter中需要直接用到的函数(间接用到的函数没关系,xcode会自动分析然后链接进来),在AppDelegate.m中先调用一遍。但是如果真的调用一遍,耗时耗电不说,还会产生副作用,为此,用一点技巧:
图片.png

先写一个touch函数,这个touch函数可以放在静态库中,也可以放在AppDelegate.m中,然后在AppDelegate.m中,这么调用一下:

touch_api(0);

这样,等于欺骗了一把xcode编译器,让他误以为我们的应用中调用了相关的函数,就把相关的函数链接进来了。

注意,如果这样是不行的:
图片.png

xcode编译器还是有点智商的,它会分析出并没有真正调用native_times和native_add两个函数,所以不会去链接。但如果变成上面的调用方式,就可以骗过xcode编译器了。