Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >建立一个跨平台可复用C++代码的实例工程(windows vs2017,android studio 可用)

建立一个跨平台可复用C++代码的实例工程(windows vs2017,android studio 可用)

作者头像
xiny120
发布于 2019-07-03 09:23:17
发布于 2019-07-03 09:23:17
1.8K00
代码可运行
举报
文章被收录于专栏:毛毛v5毛毛v5
运行总次数:0
代码可运行

一直想建立一个可复用c/c++代码的跨平台交叉编译的工程,特别是能分别使用vs2017,android studio , xcode 三种ide来在各自平台进行编码。这样就可以做到算法用c/c++多平台复用,平台特有api直接用nactive编码。最后再结合每个平台上的webview来实现界面web化,用h5来写界面。 这样一套就是,界面用H5,平台IO访问接口(除了文件IO,和socket io,因为c/c++代码完全可以进行文件io和socketio)用原生代码,算法用c/c++编写,做到写一次交叉编译到多个平台,节约编码时间和跨平台难度。 最近在github.com就发现了一个开源工程,实现了,用vs2017,anroid studio,xcode 协调编辑同一套代码,并分发不同平台的功能,但是他的as工程用的ndk build模式,as 3.1已经不推荐使用了,因为代码比较多,迁移起来好像狠麻烦,于是想自己做。得益于as迁移到用CMake来组织JNI工程代码,好像实现起来也狠顺利。 首先新建一个根目录 Shot4Read。三个平台的project都放在这个目录。 结构如下,其中Prj.Android 放的as 工程。Prj.Windows放的vs2017工程。ddmcore放的是可三端复用的c/c++代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
H:\DEVTOOLS\project\git\Shot4Read>dir
 驱动器 H 中的卷没有标签。
 卷的序列号是 CC73-754C

 H:\DEVTOOLS\project\git\Shot4Read 的目录

2019-07-02  16:37    <DIR>          .
2019-07-02  16:37    <DIR>          ..
2019-07-02  18:45               419 .gitignore
2019-07-02  18:36    <DIR>          ddmcore
2019-06-28  16:54    <DIR>          Prj.Android
2019-07-02  17:04    <DIR>          Prj.Windows
               1 个文件            419 字节
               6 个目录 11,622,670,336 可用字节

在Shot4Read目录建好后,还是空的时候,先用vs2017建立一个MFC对话框工程放到Prj.Windows目录,然后再建立一个dll工程名字就是ddmcore,放到shot4read目录。这样windows工程就建立好了。 然后在shot4read目录建立一个as的jni工程,放到Prj.Android目录中。要使as能勾复用dmmcore中的代码,需要在cpp/CMakeLists.txt文件中改变如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE ON)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.


#定义CASSDK位置 // 这里就是导入复用的c/c++代码目录。
if(NOT DDMCORE_DIR)
    set( DDMCORE_DIR ${CMAKE_SOURCE_DIR}/../../../../../ddmcore)
endif()
if( IS_DIRECTORY ${DDMCORE_DIR} )
    # Add header file include directories
    include_directories(${DDMCORE_DIR})#添加多目录的路径
    # Add block directories
    # 第二个cassdk.out参数用于指定外部文件夹在输出文件夹中的位置
    add_subdirectory( ${DDMCORE_DIR} cassdk.out)
else()
    message(FATAL_ERROR   "INVALID FOLDER 'CASSDK_DIR'=${DDMCORE_DIR}" )
endif()






add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib


        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        native-lib
        ddmcore-lib
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

然后还需要在ddmcore目录创建一个CMakeLists.txt,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE ON)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.




add_library( # Sets the name of the library.
        ddmcore-lib ##引入ddmcore库

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        apitest.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib


        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        ddmcore-lib #连接ddmcore-lib。
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

这两个CMakeLists.txt文件编辑好后,刷新as之后,可以发现as直接把ddmcore目录的代码自动包含到工程了。如下图:

AS工程刷新后的目录结构

至此就成功了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
今天介绍一下Android Studio 2.2 下 NDK开发 ,那叫一个顺溜—-纵享丝滑! 虽然现在AS 2.2 之后,jni开发配置相当方便,但是还是建议大家从我的第一篇文章看起,从基础知识入手,并且要了解之前是如何配置NDK工程的,这是一个循序渐进的过程。
先知先觉
2019/01/21
7300
Android JNI 开发
几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。
Oceanlong
2019/02/22
1.4K0
Android JNI 开发
Android利用SurfaceView显示Camera图像爬坑记(五) -- 在现有项目中加入NDK配置
前面几章我们已经把SurfaceView加载Camera实现实时帧显示图像完成了,我也说过,我们加载实时图像是为了对接OpenCV进行图像处理所以才生成的Bitmap图像。
Vaccae
2019/07/25
1K0
NDK开发案例 | C/C++调用java层代码
随笔分类 - jni NDK开发(三)——C/C++代码如何调用java层代码 E:\AndroidProject\TheTestPro\NDKDemo\app\build\intermediates\javac\debug\classes>javap -s -p com.lwp.ndkdemo.MainActivity Compiled from "MainActivity.java" public class com.lwp.ndkdemo.MainActivity extends androidx.a
凌川江雪
2020/07/22
5800
Android JNI学习(二)——实战JNI之“hello world”
首先在Android Studio创建一个Android项目,包名为gebilaolitou.ndkdemo
隔壁老李头
2018/08/30
3.3K0
Android JNI学习(二)——实战JNI之“hello world”
Android引入OpenCV
简介 在移动开发中,如果我们要实现一些图像处理相关的功能,难免要用到OpenCV。而OpenCV是用c++开发的。我们在Android中,需要使用jni的方法去使用它。 引入配置 我们引入jni开发的基本配置方法,已经在另一篇博客中介绍过了,不再赘述。这一次我们无非是要引入第三方的c++库。 首先,我们找到或新建jniLibs文件夹,然后将依赖的动态库和静态库(路径为OpenCV-android-sdk\sdk\native\libs)拷贝到\src\main\jniLibs下面。 然后,找到cpp文件夹。
Oceanlong
2018/07/03
1.3K0
OpenCV4Android中NDK开发(一)--- OpenCV4.1.0环境搭建
以前的文章中《OpenCV简介与Android SDK环境》列出过OpenCV4Android的开发,不过当时是用的Java实现,做了一些Demo后慢慢发现,在图像处理中用JAVA调OpenCV的开发处理速度是个瓶颈,所以才激起了学习NDK开发的想法,具体NDK开发的配置可以看我前面的文章《Android NDK编程(一)---NDK介绍及环境搭建》,本章主要说后面的OpenCV在Android NDK开发的环境搭建。
Vaccae
2019/07/25
3.6K6
NanoMsg框架|C++的相关函数介绍及AndroidNDK的简单使用
前面的文章我们已经把C#通过NNanoMsg实现通讯的Demo说完了,本章开始介绍Android的通讯,通过NDK的方式主要是C++的调用,所以开始我们还是要先介绍一下怎么通过C或C++的调用NanoMsg。
Vaccae
2020/03/11
2.7K0
FFmpeg4.0.2编译32位和64位动态库,并且引入到Android项目中
近期刚好用到FFmpeg来处理视频编码,由于网上各种版本的so库大部分都32位的,所以打算自己来编译32位和64位的库,我之前有写编译32位的库https://cloud.tencent.com/developer/article/1661468里面有关于ndk和32位的相关配置。今天主要是总结一下FFmpeg的64位的动态库编译。
包子388321
2020/07/14
3K0
Android串口入门
1. Andorid串口开发包一般使用google多年前提供的android-serialport-api, 提供自用分支
Zeal
2020/11/10
3.1K0
我的第一个caffe Android程序
在上一篇文章《我的第一个caffe C++程序》中,说明了如何编写一个最简单的caffe C++程序,但我的最终目的是希望在Android app中使用caffe框架。所以接下来我就将模型测试程序testXOR移植到Android中,让Android app也能使用caffe深度学习框架。
云水木石
2019/07/01
1.1K0
我的第一个caffe Android程序
Android进阶-NDK技术
    在学习ndk技术前,我们需要先了解一下JNI(Java Native Interface)技术,JNI技术是一种实现Java代码和C/C++代码之间交互的技术,它提供了一组编程接口,使得Java程序可以调用C/C++代码并与其进行通信。通过JNI技术,开发者可以将C/C++代码嵌入Java项目中,并在Java代码中调用这些C/C++函数。那么,NDK技术和它有什么关系呢?NDK是一种用于开发Android应用程序的工具集,它允许开发者使用C/C++编写部分或全部的Android应用程序代码,以便提高性能和访问底层系统功能。这样看起来NDK技术和JNI技术是一回事,就是为了实现Java调用C/C++或C/C++调用Java。确实如此,用一句话概括它们之间的关系就是:开发者使用NDK技术在Android应用程序中编写C/C++代码,并将其编译成共享库(如.so文件),然后使用JNI技术在Java代码中加载并与这些C/C++代码进行交互。
故乡的樱花开了
2023/10/22
5680
Android进阶-NDK技术
Android NDK的初步认识(Android Studio 2.2 + CMake)
序言: 做NDK开发也有一段时间了,还记得初学的时候各种找大神、搜教程,最后在诸多大神的帮助下,成功的做出了我的第一个NDK小玩意,很感谢他们,而后慢慢的越入越深(keng),今天在群里看到了很多像我之前那样各种找问题的哥们,感受颇多,遂写下此文章,给那些新入坑的哥们一些方向。
胖虎哥
2023/05/10
3330
Android NDK的初步认识(Android Studio 2.2 + CMake)
白嫖ijkplayer
我们要引入ijkplayer播放器的时候,发现一个小小的缺陷就是so库太大了,一般有3个so库:
马上就说
2020/11/11
1.6K0
白嫖ijkplayer
Android JNI 开发初体验(四)
我们都知道Java和C/C++不同 ,它不会直接编译成平台机器码,而是编译成虚拟机可以运行的Java字节码的.class文件,而Android底层的c/c++库。所以在音视频开发的时候,如果在java层处理数据,则要把数据从native层拷贝到java进行处理,处理完再拷贝回native层,这样处理效率会比较低下。为了提高代码的性能,会引入java和c,c++的混合开发。
PengJie
2021/01/03
1.9K0
【Android 音视频开发:FFmpeg音视频编解码篇】二、Android 引入FFmpeg
在过去,通常使用 makefile 的方式在项目中引入 C/C++ 代码支持,随着 Android Studio 的普及,makefile 的方式已经基本被 CMake 替代。
开发的猫
2020/04/01
2.7K0
Android NDK编程(二)---CMakeList.txt详解
前一篇我们介绍了《Android NDK编程(一)---NDK介绍及环境搭建》,简单介绍了一下什么是NDK和JNI,以前NDK环境的配置及怎么创建第一个NDK的程序,在上一篇的左侧栏中有一个CMakeList.txt的文件,这一章我们就来解析一下CMakeList文件。
Vaccae
2019/07/25
3.6K0
Android基于CMake进行OpenCV开发配置
新建项目,勾选【Include C++ support】,后续一直按【next】按钮取默认设置即可。
IT晴天
2018/08/20
1.1K0
JNI处理图片——黑白滤镜
前言 在Android的开发中,我们有时会遇到对性能要求比较高的模块。所幸Android通过NDK为我们提供了c++开发的方式。我们可以通过c++完成核心的耗时的计算,然后通过JNI的方式将处理完成的
Oceanlong
2018/07/03
1.5K0
Android NDK cmake编译方式(六)
Android Studio 2.2 及以后的版本默认使用CMake进行 NDK 编译,让开发者在开发NDK程序时可以进行联机调试,大大的提高了开发者开发NDK程序的效率,如果想详细了解在cmake下定位调试bug的可以看一下笔者以前发布过的文章。
PengJie
2021/01/10
2.6K0
相关推荐
Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档