这里写自定义目录标题

  • 一、使用NDK编译C++代码
    • 1.1概述
    • 1.2 NDK下载与环境配置
    • 1.3 NDK代码编译
      • 1.3.1 编译目录建立
      • 1.3.2 mk文件配置
      • 1.3.2 NDK编译
  • 1.4 总结

一、使用NDK编译C++代码

1.1概述

最近需要把PC端实现的算法移植到Unity3d, 但是发现从C++算法移植到C#代码性能损失的太多了。在C++实现下,是可以做到实时的,但是移植到C#上面几乎卡的不能动了。PC端况且如此,那么Android端几乎不用想了。因此考虑将代码打包成动态库,用C#调用动态库实现高性能算法。

1.2 NDK下载与环境配置

  1. NDK下载: https://developer.android.com/ndk/downloads/index.html
  2. NDK安装:将下载的NDK解压,放置在合适的位置,我放置的位置如下图所示
  3. 环境配置1:在系统变量中添加NDK_ROOT, 指向NDK的目录

    4.环境配置2:在Path中添加NDK_ROOT
  4. NDK测试:在cmd命令行中输入ndk-build,出现下面内容表示成功

1.3 NDK代码编译

网上的教程大多数是针对Java的,而我的需求主要是生成C#可以调用的动态库文件。

1.3.1 编译目录建立

在ndk的目录中的sample文件夹建立一个ExpSolver文件夹,然后建立JNI文件夹。在JNI文件夹中放置C++文件与依赖库。如下图所示:

1.3.2 mk文件配置

NDK通过mk文件来识别生成so库的安卓支持版本、生成平台、库支持等功能。

Application.mk

# 编译所有CPU的.so
# APP_ABI := all  # 添加几乎全平台支持 ARM-x86
APP_ABI := armeabi-v7a x86 arm64-v8a x86_64  # 最低android版本为 android-14 -> android-4.0
APP_PLATFORM := android-14# 添加C++ STL库支持
APP_STL := stlport_static

Android.mk

# ------------------------------------------------------------------------------#
# 描述 :    Expression Fitting Solver Config File
# 作者 :
# 时间 :    2018-12-24
#-------------------------------------------------------------------------------## 设置本地目录
LOCAL_PATH := $(call my-dir)# --------------------------- 标准库支持 ---------------------------------------## 添加C++ stl 头文件支持
LOCAL_C_INCLUDES := $(NDK_ROOT)/sources/cxx-stl/stlport/stlportLOCAL_STATIC_LIBRARIES := $(NDK_ROOT)/sources/cxx-stl/stlport/libs/armeabi/libstlport_static.a# --------------------------- 第三方库支持 -------------------------------------## 添加Eigen3 矩阵运算库支持
LOCAL_C_INCLUDES += $(LOCAL_PATH)/Eigen# 添加Eigen3 NNLS 求解器支持
LOCAL_C_INCLUDES += $(LOCAL_PATH)/Eigen3-nnls# ----------------------------工程文件包含--------------------------------------#include $(CLEAR_VARS)LOCAL_MODULE := ExpSolver# 包含文件设置
LOCAL_SRC_FILES := ExpSolver.cpp
# ----------------------------配置文件生成类型 ---------------------------------## 生成可执行文件
# include $(BUILD_EXECUTABLE) # 生成动态链接库
include $(BUILD_SHARED_LIBRARY)

1.3.2 NDK编译

通过cmd进入到要编译的目录,调用ndk-build命令编译代码,如下图所示:

1.4 总结

网上很多的教程主要是针对java的,同时很多教程也需要用到AndroidStudio等一系列东西。对于我们这种做算法开发的,不太熟悉过多的Android环境开发方面的东西。因此单独使用NDK最为简单。当我们使用NDK时,可以直接把NDK类似CMake的编译器使用,生成多平台的动态库即可。

使用NDK编译C++代码相关推荐

  1. Linux下编译build的命令,Linux命令行下编译Android NDK的示例代码

    这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究Android NDK ...

  2. Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/52088039 最近在移植一个 JNI 项目, 比较纠结, A ...

  3. 【Android开发】:在任意目录执行NDK编译

    2019独角兽企业重金招聘Python工程师标准>>> 文以简单的例子讲述如何在任意目录把自己写的C代码使用NDK提供的交叉编译该工具来编译成Android可使用的静态库/动态库. ...

  4. Android开发实践:在任意目录执行NDK编译

    本文暂时不讲述如何用NDK编译第三方开源代码库,而是先以简单的例子讲述如何在任意目录把自己写的C代码编译成Android可使用的静态库/动态库. 1. 准备环境 首先,你得安装了Android的NDK ...

  5. NDK 编译和使用静态库、动态库

    NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...

  6. android.mk ndk编译选项优化,Android NDK 编译脚本分析 之一

    版权信息:本文为本人原创,欢迎转载,但请著明出处,并保留本版权信息. Android NDK编译脚本编写起来还是是比较简单条理的,然而它的语法和传统的linux GNU Make编译脚本的编写似乎有很 ...

  7. android prebuild第三方so库,Android NDK编译本地文件以及引用第三方so文件

    在需要引入第三方的so文件的情况下,怎样使用NDK编译本地代码? 1.新建jni文件夹,将你要编译源码的文件以及需要引入的so文件复制到jni文件目录下 2.编写android.mk文件,首先将你的将 ...

  8. WIN10 x64搭建OLLVM4.0 android NDK 编译环境跨坑指南

    本文参考大量相关博客,甄选出有用的文章,帮助大家远离陷阱,节省时间. 目录 平台说明 环境准备 添加String混淆 集成到ndk编译工具链 模式介绍与使用方法 编译错误 Cannot open /d ...

  9. 在安卓项目中使用gifsicle编辑GIF动图-Android NDK 编译 gifsicle 为可执行文件记录

    一.前言 最近项目中有需要压缩GIF的需求,最开始时试图使用FFmpeg通过降低GIF的分辨率和帧率的来减少GIF文件体积,但实际测试下来,大多数情况下压缩效果并不理想,甚至会出现降低分辨率后导出的G ...

  10. 基于NDK编译Android平台的FFmpeg动态库

    需求 FFmpeg在Linux平台(如Ubuntu)上的支持已经比较完善了,如前述文章介绍 http://blog.csdn.net/ericbar/article/details/73702061, ...

最新文章

  1. MySQL面试题 | 附答案解析(八)
  2. intel219网卡的linux驱动,ubuntu16.04安装I219-V网卡驱动问题解决方法(示例代码)
  3. Linux学习笔记(知识点总结)
  4. java程序启动命令_如何用java启动windows命令行程序
  5. 最担心的事情还是发生了!三星折叠屏手机翻车:闪屏、黑屏、“脱皮”
  6. Reef Finance与Manta Network就流动性解决方案达成合作
  7. 关于vite2.0和vue/cli建立项目的区别
  8. CentOS安装MySQL问题汇总
  9. 有趣的JavaScript数组
  10. oppoA83怎么升级android版本,OPPOA83系统刷机包(官方最新固件升级包正式版-A.37)...
  11. 使用 hydra 破解路由器密码
  12. 去掉讨厌的“windows盗版软件受害者”的提示
  13. 数据链路层详细解剖,并完成实现不同交换机相同VLAN主机之间的通信实验
  14. 脚本之家电子书下载:https://www.jb51.net/books/
  15. linux下装go环境
  16. ft232h引脚_K9K8G08U0B-PIB0--斗门--镁光MICRON内存收购
  17. 故障:不能 demote 域控制器
  18. Java: 实训三 类与对象、继承
  19. 罗斯福国家森林树木类型识别
  20. 计算机应用软件用着总是闪退是什么原因

热门文章

  1. Java版飞翔的小鸟代码完整
  2. 个人职场工作感悟总结「如何尽快地提升自我」
  3. 单片机c语言设计奥运五环,用C语言程序来设计奥运五环图案
  4. sqli-labs(38-41)
  5. 利用@media与@media screen进行响应式布局
  6. (附源码)node.js物资管理系统 毕业设计 071130
  7. __kindof用法
  8. 凸优化极简笔记(三):椭圆方程的矩阵形式
  9. MATLAB课设代做在哪儿找,代写Grid World作业、代做CID留学生作业、代写Matlab课程设计、代做Matlab编程实验作业...
  10. HBuilder使用夜神模拟器