当前位置: 首页 > news >正文

CMakeLists生成动态库.so和静态库.a

一、下载NDK CMake

- NDK :  26.2.11394342  或 23.1.7779620

- CMake : 3.22.1

二、新建android\app\CMakeLists.txt

文件CMakeLists.txt内容

cmake_minimum_required(VERSION 3.4.1)
#mker为项目名称
project('mker')#设置生成的so动态库最后输出的路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})#生成动态库.so
add_library(
#c/cpp代码将要编译成为so库的名称,dart代码加载库文件要用这个名称
        native_lib         SHARED #动态库
#cpp代码文件路径 可以在下面接着随意添加c、c++文件
        cpp/native_lib.cpp ) #生成静态库.a
 add_library(
        #静态库.a的名称
        mystatic        STATIC #静态库
        #cpp代码文件路径 可以在下面接着随意添加c、c++文件
        cpp/native_lib.cpp )

三、app/build.gradle配置

    defaultConfig {
。。。。。。
//新增
        externalNativeBuild {
            cmake {
                targets 'mystatic','native_lib'
            }
// > [CXX1201] ABIs [armeabi] are not supported for platform. Supported ABIs are [arm64-v8a, armeabi-v7a, x86, x86_64].
//            ndk {
//                abiFilters 'x86_64','x86','arm64-v8a', 'armeabi-v7a'
//            }
        }    } //新增:编译自己的CMake进项目
    externalNativeBuild {
        // Encapsulates your CMake build configurations.
        cmake {
            path "../CMakeLists.txt"
        }
    }

四、放c++代码:/android/app/cpp/native_lib.cpp

#include <stdint.h>
#include <cstring>
extern "C" {
__attribute__((visibility("default"))) __attribute__((used))
int32_t native_add(int32_t x, int32_t y) {
    return x + y;
}
__attribute__((visibility("default"))) __attribute__((used))
int32_t native_add2(int32_t x, int32_t y) {
    return x + y;
}
__attribute__((visibility("default"))) __attribute__((used))
char* concat(const char* str1, const char* str2) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    char* result = new char[len1 + len2 + 1];
    strcpy(result, str1);
    strcat(result, str2);
    return result;
}
}extern "C" __attribute__((visibility("default"))) __attribute__((used))
int32_t native_add3(int32_t x, int32_t y) {
    return x + y;
}

五、生成动态库.so和静态库.a

项目根目录下执行命令:flutter build apk后app文件夹下会自动生成libs文件夹,里面放的是不同cpu下的.so文件

.a存放的位置:android/app/.cxx/RelWithDebInfo/5p5v2i3r/arm64-v8a/libmystatic.a

注:生成的.a文件好像不能使用,通过命令行lipo -info xxx.a 查不出cpu架构类型

六、动态库.so验证:

1.pubspec.yaml文件下添加依赖 ffi: ^2.1.2
2.项目lib文件夹下放native_add.dart
import 'dart:ffi' as ffi;
import 'dart:ffi';
import 'dart:io'; // For Platform.isXimport 'package:ffi/ffi.dart';final DynamicLibrary nativeAddLib = Platform.isAndroid
    ? DynamicLibrary.open("libnative_lib.so")
    : DynamicLibrary.process();final int Function(int x, int y) nativeAdd = nativeAddLib
    .lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add")
    .asFunction();final int Function(int x, int y) nativeAdd2 = nativeAddLib
    .lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add2")
    .asFunction();final int Function(int x, int y) nativeAdd3 = nativeAddLib
    .lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add3")
    .asFunction();typedef A2 = Pointer<Utf8> Function(ffi.Pointer<Utf8>, ffi.Pointer<Utf8>);String concatStr(String str1, String str2) {
  final privateKeyPtr = str1.toNativeUtf8();
  final hexCidMessagePtr = str2.toNativeUtf8();
  final concat =
      nativeAddLib.lookup<ffi.NativeFunction<A2>>('concat').asFunction<A2>();
  return concat(privateKeyPtr, hexCidMessagePtr).toDartString();
}bool isExistSymbol(String symbol) {
  final isOk = nativeAddLib.providesSymbol(symbol);
  return isOk;
}
3.flutter调用.so里的方法
 int result = nativeAdd(1, 2);
    int result2 = nativeAdd2(1, 2);
    int result3 = nativeAdd3(1, 2);
    print('-------------------------result:$result---result2:$result2---result3:$result3');

相关文章:

  • SnapGene 5 for Mac 分子生物学软件
  • 某某消消乐增加步数漏洞分析
  • LeetCode 406. 根据身高重建队列
  • STM32G473之flash存储结构汇总
  • 工业边缘计算网关在工业中的应用以及其为工业生产带来的效益-天拓四方
  • 【WebJs 爬虫】逆向进阶技术必知必会
  • SpringMVC设置全局异常处理器
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • 蓝桥杯-卡片换位
  • 设计模式学习笔记 - 设计模式与范式 -结构型:7.享元模式(上):享元模式原理和应用
  • Web Components使用(一)
  • 【ZZULIOJ】1014: 求三角形的面积(Java)
  • 网络工程师实验命令(华为数通HCIA)
  • 机器学习_集成学习_梯度提升_回归_决策树_XGBoost相关概念
  • 初识C++之命名空间(namespace)
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 2018一半小结一波
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android组件 - 收藏集 - 掘金
  • ECMAScript入门(七)--Module语法
  • extract-text-webpack-plugin用法
  • javascript 哈希表
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java第三方包学习之lombok
  • magento 货币换算
  • nodejs:开发并发布一个nodejs包
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • vue.js框架原理浅析
  • 初识 beanstalkd
  • 搭建gitbook 和 访问权限认证
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于 Cirru Editor 存储格式
  • 目录与文件属性:编写ls
  • 区块链技术特点之去中心化特性
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 微信公众号开发小记——5.python微信红包
  • 一道面试题引发的“血案”
  • 正则学习笔记
  • 字符串匹配基础上
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #微信小程序:微信小程序常见的配置传值
  • $.ajax中的eval及dataType
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (javascript)再说document.body.scrollTop的使用问题
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (八十八)VFL语言初步 - 实现布局
  • (二)fiber的基本认识
  • (二)linux使用docker容器运行mysql
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • ..回顾17,展望18
  • .net core 控制台应用程序读取配置文件app.config