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目录中,如下

作者:Andy周
链接:https://www.jianshu.com/p/02ccd73c927e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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_sources
src/json_tool.h
src/json_reader.cpp
src/json_valueiterator.inl
src/json_value.cpp
src/json_writer.cpp
src/version.h.in) #INDEX= "arm"
#INDEX= "arm64"
#INDEX= "x86"
#INDEX= "x86_64"
#INDEX= "mips"
#INDEX= "mips64" SET(INDEX ) 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 )

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 := -fexceptions LOCAL_STATIC_LIBRARIES := jsoncpp LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE LOCAL_LDLIBS := -llog include $(BUILD_EXECUTABLE)

新建Application.mk文件

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

新建main.cpp

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

然后编译

ndk-build

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

./main

最新文章

  1. 表在用时建索引要加ONLINE
  2. WCF初探-15:WCF操作协定
  3. 设计模式C#实现(二)——适配器模式
  4. Linux的文件属性
  5. Python如何读取指定文件夹下的所有图像
  6. Oracle EBS-SQL (SYS-8):职责定义明细.sql
  7. Runtime - ③ - 分类Category探究
  8. Day062--django--模板,母版和继承
  9. C#基础知识之泛型
  10. Java 中的锁机制
  11. Go 语言学习笔记
  12. 最难解的耦合 — James
  13. Android开发 ---ContentProvider数据提供者,Activity和Service就是上下文对象,短信监听器,内容观察者
  14. Kubernetes部署SpringCloud(一) Eureka 集群,解决unavailable-replicas,available-replicas条件
  15. 论FPGA建模,与面向对象编程的相似性
  16. Pandas的concat方法
  17. uva11107 后缀数组
  18. 20145127《java程序设计》第七周学习总结
  19. C#加密方法汇总(SHA1加密字符串,MD5加密字符串,可逆加密等)
  20. Golang channel 的基本使用方法

热门文章

  1. IntelliJ IDEA使用教程三 SVN的集成与使用
  2. WaitForSingleObject和CEvent用法
  3. 探秘C#中的yield关键字
  4. CentOS 6.5系统下安装和配置NFS服务
  5. Android SDK目录及版本号区别
  6. iOS 下 Podfile 使用方法
  7. git打pach包
  8. Git 学习(七)标签管理
  9. SQLAlchemy 操作方法汇总
  10. OpenCV学习(31) 基于defects的简单手势