简书排版
http://www.jianshu.com/p/02ccd73c927e

本机OS: Ubuntu 14.04 x64

NDK开发模块的时候,如果涉及到网络请求,类似json数据传递的时候,有现成的第三方json库可以移植,后台C++开发中使用的比较多的是jsoncpp,今天记录一下jsoncpp移植到Android平台的过程

cmake编译

此方法并非标准的NDK项目
采用的是cmake交叉编译生成
jsoncpp地址
https://github.com/open-source-parsers/jsoncpp
先将源码克隆下来
新建文件夹libjson
将jsoncpp源码中的include文件夹复制到该目录,然后进入src/lib_json目录复制
部分文件到libjson目录下的src目录中,如下

json_reader.cpp
json_tool.h
json_value.cpp
json_valueiterator.inl
json_writer.cpp
version.h.in

在libjson目录新建文件CMakeLists.txt
内容如下

CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
PROJECT(Jpp)SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")#ARCHS集合
SET(ARCHS "arm" "arm64" "x86" "x86_64" "mips" "mips64")#PLATFORM集合
SET(PLATFORM "arm-linux-androideabi" "aarch64-linux-android" "i686-linux-android" "x86_64-linux-android" "mipsel-linux-android" "mips64el-linux-android")SET(JSONCPP_INCLUDE_DIR include)INCLUDE_DIRECTORIES(${JSONCPP_INCLUDE_DIR})SET(PUBLIC_HEADERS${JSONCPP_INCLUDE_DIR}/json/config.h${JSONCPP_INCLUDE_DIR}/json/forwards.h${JSONCPP_INCLUDE_DIR}/json/features.h${JSONCPP_INCLUDE_DIR}/json/value.h${JSONCPP_INCLUDE_DIR}/json/reader.h${JSONCPP_INCLUDE_DIR}/json/writer.h${JSONCPP_INCLUDE_DIR}/json/assertions.h${JSONCPP_INCLUDE_DIR}/json/version.h)SOURCE_GROUP("Public API" FILES ${PUBLIC_HEADERS})SET(jsoncpp_sourcessrc/json_tool.hsrc/json_reader.cppsrc/json_valueiterator.inlsrc/json_value.cppsrc/json_writer.cppsrc/version.h.in)#INDEX=0 "arm"
#INDEX=1 "arm64"
#INDEX=2 "x86"
#INDEX=3 "x86_64"
#INDEX=4 "mips"
#INDEX=5 "mips64"SET(INDEX 0)list(GET ARCHS ${INDEX} TARGET_ARCH)
list(GET PLATFORM ${INDEX} TARGET_PLATFORM)MESSAGE("ARCH= " ${TARGET_ARCH})
MESSAGE("PLATFORM= " ${TARGET_PLATFORM})SET(CMAKE_C_COMPILER "$ENV{HOME}/android-toolchain/${TARGET_ARCH}/bin/${TARGET_PLATFORM}-gcc")
SET(CMAKE_CXX_COMPILER "$ENV{HOME}/android-toolchain/${TARGET_ARCH}/bin/${TARGET_PLATFORM}-g++")SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)ADD_LIBRARY(${TARGET_ARCH}_share SHARED ${PUBLIC_HEADERS} ${jsoncpp_sources})
SET_TARGET_PROPERTIES(${TARGET_ARCH}_share PROPERTIES OUTPUT_NAME ${TARGET_ARCH})
ADD_LIBRARY(${TARGET_ARCH}_static STATIC ${PUBLIC_HEADERS} ${jsoncpp_sources})
SET_TARGET_PROPERTIES(${TARGET_ARCH}_static PROPERTIES OUTPUT_NAME ${TARGET_ARCH})

编译之前确认已安装cmake
如果没有,请先安装

sudo apt-get install cmake

目录结构如下

交叉编译请,参考笔者之前记录的《NDK交叉编译之自定义工具链》

准备工作做好之后可以进行编译了

cmake .
make

笔者目前只编译了arm平台的,如果有需要其他平台的,只需要改动上述CMakeLists.txt中的编号即可

SET(INDEX 0)

NDK原生编译

测试

下面简单测试一下,就不建Android项目了
新建文件夹JNI
将刚才生成的libarm.a和include文件夹放入进去,新建文件Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := jsoncpp
LOCAL_SRC_FILES := libarm.a
include $(PREBUILT_STATIC_LIBRARY)  include $(CLEAR_VARS)
LOCAL_MODULE    := main
LOCAL_C_INCLUDES  := $(LOCAL_PATH)/include/json
LOCAL_SRC_FILES := main.cpp
LOCAL_CPPFLAGS := -fexceptionsLOCAL_STATIC_LIBRARIES := jsoncpp  LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIELOCAL_LDLIBS := -lloginclude $(BUILD_EXECUTABLE)

新建Application.mk文件

APP_ABI := armeabi
APP_PLATFORM := 12
APP_STL := gnustl_static
APP_CPPFLAGS := -fexceptions -frtti
APP_CPPFLAGS += -std=gnu++11
APP_CPPFLAGS += -fpermissive

新建main.cpp


#include <jni.h>
#include <iostream>
#include "include/json/json.h"using namespace std;void JsonTest();int main(){JsonTest();return 0;
}void JsonTest(){Json::Value root;Json::Value array;Json::Value item;for (int i = 0; i < 2; i ++){item["id"] = i;item["name"] = "name";array.append(item);}root["username"] = "andy";root["age"] = 18;root["array"] = array;string out = root.toStyledString();cout << out << endl;
}

然后编译

ndk-build

然后将生成的main执行文件上传到手机中测试,手机需要root权限
笔者一般丢在/data/local目录下测试

./main

ubuntu移植jsoncpp到Android平台相关推荐

  1. 假防病毒软件从电脑移植到了 Android 平台

    以前有位女研究生点击网络钓鱼的链接.随即出现实时扫毒画面的方式,接着呈现了扫毒结果,跑出十余笔病毒数据,记录了被感染的计算机的具体位置,并提示她必须更新防病毒软件,而她在付费两千元后收到"防 ...

  2. java jni udt找不到so_移植UDT到Android平台

    UDT是UDP Based Data Transfer的缩写,这是一个基于UDP协议的在应用层实现的一种面向连接的传输协议,主要目的是在于支持高速广域网上的数据海量传输.其采用C++开发,具有高度的可 ...

  3. 移植memtester到android平台

    硬件搭建起来能进入系统,首要就是测试内存的稳定性,需要一款内存测试工具. 一般都是选择memtester这款linux软件,下载地址如下:http://pyropus.ca/software/memt ...

  4. srtp移植到android平台

    因项目需要,需要把srtp移植到android平台,于是我开始了艰难的旅程. 1,首先跑通demo代码, 在test下面有一个rtpw.exe这个就是demo,在cygwin下面运行下 接收端 :./ ...

  5. android 3d 游戏,盘点Android平台十款画面最强3D游戏

    Android平台的发展非常迅猛,系统版本从2.1.2.2一路飙升至2.3,各种手机与平板设备也层出不穷. 与此相对的当然就是应用软件的大爆发,根据AndroLib日前所公布的数字,Android M ...

  6. 在ubuntu系统下cocos2dx移植到android平台

    1.序 在网络上搜索cocos2dx移植到android的文章有很多, 本文也是参考根据网络上的文章移植成功的, 下面将本人的移植过程以及移植过程中遇到的问题记录下来以供今后参考和即将移植的新人一个参 ...

  7. FFmpeg的Android平台移植—编译篇(验证可用)

    摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: Ubuntu12.04 TLS android-ndk-r9d-linux-x86_64.t ...

  8. Android平台移植FFmpeg和x264

    音视频实践学习 android全平台编译ffmpeg以及x264与fdk-aac实践 ubuntu下使用nginx和nginx-rtmp-module配置直播推流服务器 android全平台编译ffm ...

  9. 移植ffplay媒体播放器和sdl2到Android平台

    前言 前述博文<基于FFmpeg和Android的音视频同步播放实现>中,我们按照自己的方法实现了一个简单的媒体播放器,并做了音视频同步.但是这个程序在播放更多码流时,遇到了一些问题,包括 ...

最新文章

  1. Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术
  2. vue 滑动加载列表 php,通过原生vue添加滚动加载更多功能
  3. Program type already present: android.support.v4.app.BackStackRecord$Op
  4. 每天一个linux命令---导出到文件
  5. 我眼中的JavaScript函数式编程
  6. 禁止微信内置浏览器调整字体大小
  7. ORA-04063: view DAILY.TMP_TBX_100_0_S4 有错误
  8. Rabin-Karp字符串查找算法学习:poj1200
  9. UItextView使用详解
  10. 数字信号处理教程matlab释义与实现,数字信号处理教程 MATLAB释义与实现 陈怀琛编...
  11. python爬虫豆瓣网的模拟登录实现
  12. 台式计算机怎么安装无线网卡,台式机用无线网卡,小编教你台式机怎么用无线网卡...
  13. 广东省计算机一级网络题分值,计算机一级考试的试题分值如何分配的?
  14. 基于 Si446x 上的 RSSI 测量的自动操作
  15. 【Unity】U3D ARPG游戏制作实例(二)人物基本动作切换
  16. hadoop运行程序时报错java.net.ConnectException: java.net.ConnectException: 拒绝连接;
  17. mongodb实现一主两从一个仲裁者
  18. ICCV 2021 |首届 SoMoF 人体序列预测比赛冠军方案分享
  19. linux常用命令语句(全)
  20. c 语言 用矩形法求定积分,如何用矩形法(梯形法)求定积分

热门文章

  1. 生活和异端·《乖摸摸头》·三
  2. 怎么打开计算机开机启动菜单,启动项,教您电脑开机启动项怎么设置
  3. VUE项目实践1:设置编辑按钮,可保存,双向绑定
  4. 狂神java web p30 sql语句
  5. 用Linux终端撩妹?
  6. 常见小票打印机打印故障及解决方法汇总视频教程-王西猛-专题视频课程
  7. TcaplusDB | 大暑,万物荣华
  8. 北邮计算机与科学技术学院副教授田野,田野 副教授 硕导
  9. whmcs不依赖index.php的方法,WHMCS版本自动升级方法
  10. Leveldb-SSTable