写在前面, 对于无源码的项目, 理论上必须有头文件,不然你不知道里面都定义了什么鬼东西.

本篇虽然是写无源码的项目, 但实际上还是会有源码部分, 只是通过 cmake,clang,xcodebuild,ndk 等工具编译成 so/framework 以供 android/ios 引入

生成动态库

整体的目录结构是这样的, 如果你只是要引入库, 可以跳过这步, 这步的主要做源码生成库的步骤

$ tree -L 3 cpp-source

tree -L 3 cpp-source

cpp-source

├── android

│ ├── CMakeLists.txt

│ ├── build_android.sh

│ └── cmd

│ └── android.sh

├── ios

│ ├── CMakeLists.txt

│ ├── build_ios.sh

│ ├── cmd

│ │ └── ios_abi_build.sh

│ └── ios.toolchain.cmake

└── src

├── some.cpp

└── some.h

src 为源码

some.cpp

#include "some.h"

#include

extern "C" __attribute__((visibility("default"))) __attribute__((used)) int32_t

native_add(int32_t x, int32_t y) {

return x + y;

}

android ios 分别对应平台的 Cmake 配置文件和打包脚本

打包 android

使用 Cmake 配置, 然后通过 ndk 完成这个步骤

CmakeLists.txt:

cmake_minimum_required (VERSION 2.6) # cmake version

project(SOME) # project name

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../../android/libs/$ENV{ABI}) # set output path

aux_source_directory(${PROJECT_SOURCE_DIR}/../src SRC_FILES) # scan source code files

add_library(some SHARED ${SRC_FILES}) # add source code files to library, and set build type to dynamic library.

然后有两个打包脚本

主脚本, 负责循环 abi, 调用副脚本, 并且完成生成的步骤

副脚本, 根据 abi 执行 cmake, 并且完成 make 的过程

主脚本build_android.sh

rm -rf ./build

a="armeabi-v7a arm64-v8a x86 x86_64"

for abi in $a;

do

export ABI=$abi

sh cmd/android.sh

done

副脚本cmd/android.sh

export NDK_HOME=$(which adb)/../../ndk-bundle # or set to your ndk home

export MAKE_PATH=build/make-cache

export TARGET_ABI=$ABI

create_makefile() {

cmake \

-DANDROID_ABI=$TARGET_ABI \

-DANDROID_PLATFORM=android-16 \

-DCMAKE_BUILD_TYPE=release \

-DANDROID_NDK=$NDK_HOME \

-DCMAKE_TOOLCHAIN_FILE=$NDK_HOME/build/cmake/android.toolchain.cmake \

-DANDROID_TOOLCHAIN=clang -B $MAKE_PATH -S .

}

create_makefile

cd $MAKE_PATH

make clean

make

只需要执行

cd cpp-source/android

./build_android.sh

就会生成对应的 so 文件

这里直接生成到插件的 libs 目录内了, 后续只需要引入即可, 引入的过程请看后面的引入篇

打包 ios

主要使用ios-cmake项目提供的脚本,配合cmake 和 xcodebuild 来完成打包这个步骤

两个脚本

build_ios.sh:

负责 cmake 和提供当前的 sdk 版本号, 调用副脚本完成打包 framework 的过程

并且将不同 abi 的二进制文件使用lipo进行合并操作

rm -fr build

mkdir build

cd build

cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=OS64COMBINED

cmake --build . --config Release --target install

cd ..

DEVICE=$(xcodebuild -showsdks|grep "iphoneos"| awk '{print $4}')

ABI=$DEVICE sh cmd/ios_abi_build.sh

SIMU=$(xcodebuild -showsdks|grep "iphonesimulator"| awk '{print $6}')

ABI=$SIMU sh cmd/ios_abi_build.sh

cd build/output

cp -rf $DEVICE fat

lipo -create $DEVICE/Release/some.framework/some $SIMU/Release/some.framework/some -output fat/Release/some.framework/some

cd ../..

cp -rf build/output/fat/Release/some.framework ../../ios

cmd/ios_abi_build.sh:

负责调用xcodebuild 完成构建 framework 的过程

echo "build ios $ABI"

cd build

cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=OS64COMBINED

cmake --build . --config Release --target install

# xcodebuild -project SOME.xcodeproj -configuration Release -sdk $ABI -alltargets clean build

xcodebuild OTHER_CFLAGS="-fembed-bitcode" -project SOME.xcodeproj -configuration Release -sdk $ABI -alltargets clean build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

只需要执行下面的命令即可打出一个 fat 的包给模拟器和真机同时可用

cd cpp-source/ios

./build_ios.sh

插件项目

现在开始, 假装没有源码, 只有 so 和 framework

android

因为 so 是分 abi 在 libs 目录下的, 而 so 库的默认目录应该是 jniLibs 目录

所以需要修改 gradle 以引入 so 库

android/build.gradle

android {

// ...

sourceSets{

// ...

main.jniLibs.srcDirs = ['libs']

}

}

这样就完成了 so 库引入的过程

ios

修改flutter_no_cpp_src.podspec

s.vendored_frameworks = 'some.framework'

这样就完成了 ios 库的引入

dart

import 'dart:async';

import 'package:flutter/services.dart';

import 'dart:ffi'; // For FFI

import 'dart:io'; // For Platform.isX

final DynamicLibrary nativeAddLib = Platform.isAndroid

? DynamicLibrary.open("libsome.so")

: DynamicLibrary.open("some.framework/some");

final int Function(int x, int y) nativeAdd = nativeAddLib

.lookup>("native_add")

.asFunction();

这样nativeAdd方法就是调用前面的c++方法来完成 a+b 的过程

静态库的问题

因为 android 只支持 so 动态库, 不支持静态库, 所以略过不表

而 ios 则同时支持静态和动态库, 这里暂时使用的是 framework 形式的动态库, 静态库的话, 可以搜索下如何转化成动态库并打包成 framework 即可

后记

以上

android 项目编译略过jni目录,在 flutter 上使用 c 代码 - (二) 无源码的项目相关推荐

  1. Zxing二维码开源项目

    最近要用到二维码的功能,发现网络上关于二维码的信息还是很多的,不过都是关于谷歌的开源项目zxing,就这样开始熟悉Zxing这个项目了. 项目的github地址:https://github.com/ ...

  2. Android超方便 集成 Zxing实现扫一扫,闪光灯,生成二维码图片,解析二维码(条码)等功能

    之前我写过一篇博客是关于如何将zxing集成到Android Studio中,以及简单的实现扫一扫功能. 详情请看:Android Studio集成Zxing扫一扫 但是,上面那篇博客只有有一个扫一扫 ...

  3. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

  4. 一个炫酷的二维码生成项目附源码

    前阵子打算换一个炫酷的公众号二维码,无奈市面上很多的二维码修改器都不尽人意. 草料二维码也挺炫酷的,但是也没有满意的效果. 于是又去万能的github逛了一下,终于找到了一款开源的二维码修改器. 这个 ...

  5. 安卓,Android,Scanner Gun,Barcode Scanner,条码,扫描枪,二维码,键盘模式

    安卓对接扫码枪,扫码枪模拟键盘输入 方案一 在页面添加个隐藏的input 框,在input框内获取值,来得到扫码枪的值. 获取焦点,软键盘弹出不易隐藏. 方案二 标准扫描枪扫描数据会触发KEYCODE ...

  6. 山东大学项目实训(四)—— 微信小程序扫描web端二维码实现web端登录

    效果 点击登录后,显示二维码→打开"探古"(本项目)微信小程序,扫描二维码确认登录→web端登录成功 主要流程 因为本人主要负责web前端的开发,所以本文仅介绍web前端的实现方法 ...

  7. android二维码开源项目zxing编译 命令行编译

    加一句话:把生成的core-3.3.1-SNAPSHOT.jar放到zxing-master\android\libs目录下. ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像 ...

  8. Android二维码开源项目zxing编译

    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码.该项目可实现的条形码编码和 ...

  9. jenkins+maven+docker java项目编译、打包、构建镜像、上传私有仓库、web容器部署

    本环境非常简单,主要实现如下流程功能 员工通过eclipse提交java代码---gitlab更新代码----jenkins通过maven编译打包----生成war包----制作docker镜像并上传 ...

最新文章

  1. JZOJ 1219. Num
  2. request设置请求头_收藏 Scrapy框架各组件详细设置
  3. C 语言实例 - 输出九九乘法口诀表
  4. servlet配置log4J
  5. [转载]MySQL exists的用法介绍
  6. 用matlab画玫瑰花,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...
  7. DSP数字信号处理实验--CCS基础入门
  8. 手机屏幕物理点击器是什么原理_手机触摸屏的原理是什么?
  9. PSP开发简明教程(1)
  10. 十大精选开源软件推荐:编程化繁为简
  11. OpenCV4.3 Java 编程入门:Core 组件中的数据结构与方法
  12. 写一个获取非行间样式的函数
  13. lorawan 科普文
  14. 如何化解濒临离婚边缘的婚姻危机
  15. 2022制冷与空调设备运行操作考试模拟100题模拟考试平台操作
  16. 数据库的横向和纵向分表
  17. 【Linux 操作系统】Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
  18. 关于手机内部存储,外部存储
  19. torch.Linear(input_size,output_size, bia = True/Flase)
  20. sikuli介绍及解决点击flash按钮的问题

热门文章

  1. mfc中在vector里添加控件类型的数据时出现C2248错误
  2. 数学小课堂:库尔贝勒交叉熵(K-L divergence,也叫KL散度)【量化度量错误预测所要付出的成本,避免制订出与事实相反的计划】
  3. utf8一个汉字最多需要多少个byte
  4. 数据分析师如何做数据分析汇报
  5. 生产型企业如何搭建进销存管理系统?低代码平台了解一下
  6. 前端vue+后台node实现获取微信用户基本信息+调用微信JS-SDK(下篇)
  7. 利用Python编写脚本批量下载公众号中的音频
  8. Android 触摸OnTouchListener没有响应问题解决
  9. 游戏获取服务器信息,易语言获取游戏服务器信息
  10. C++华为+阿里+鹅厂面经大盘点-如果换做你能成功吗?