1.protobuf 编译过程

  • 前提: 确保自己电脑上已经安装了cygwin + ndk, 并且NDK能够编译hello-jni成功

1.1 把protobuf 压缩包解压到protobuf文件夹下

1.2 在protobuf文件夹下新建jni文件下

1.3 把protobuf文件夹下的src文件夹复制一份到jni文件夹下

1.4 在jni文件夹下新建Android.mk文件并且在里面添加如下内容

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := protobuf

LOCAL_MODULE_FILENAME := libprotobuf

LOCAL_SRC_FILES := src/google/protobuf/io/coded_stream.cc \
src/google/protobuf/stubs/common.cc \
src/google/protobuf/descriptor.cc \
src/google/protobuf/descriptor.pb.cc \
src/google/protobuf/descriptor_database.cc \
src/google/protobuf/dynamic_message.cc \
src/google/protobuf/extension_set.cc \
src/google/protobuf/extension_set_heavy.cc \
src/google/protobuf/generated_message_reflection.cc \
src/google/protobuf/generated_message_util.cc \
src/google/protobuf/io/gzip_stream.cc \
src/google/protobuf/compiler/importer.cc \
src/google/protobuf/message.cc \
src/google/protobuf/message_lite.cc \
src/google/protobuf/stubs/once.cc \
src/google/protobuf/compiler/parser.cc \
src/google/protobuf/io/printer.cc \
src/google/protobuf/reflection_ops.cc \
src/google/protobuf/repeated_field.cc \
src/google/protobuf/service.cc \
src/google/protobuf/stubs/structurally_valid.cc \
src/google/protobuf/stubs/strutil.cc \
src/google/protobuf/stubs/substitute.cc \
src/google/protobuf/text_format.cc \
src/google/protobuf/io/tokenizer.cc \
src/google/protobuf/unknown_field_set.cc \
src/google/protobuf/wire_format.cc \
src/google/protobuf/wire_format_lite.cc \
src/google/protobuf/io/zero_copy_stream.cc \
src/google/protobuf/io/zero_copy_stream_impl.cc \
src/google/protobuf/io/zero_copy_stream_impl_lite.cc \
src/google/protobuf/stubs/stringprintf.cc LOCAL_EXPORT_C_INCLUDES :=
LOCAL_EXPORT_LDLIBS := LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(LOCAL_PATH)/src LOCAL_LDLIBS := -llog -lz include $(BUILD_STATIC_LIBRARY)

1.5 在jni文件夹下新建Application.mk文件并且在里面添加如下内容

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti
APP_ABI := armeabi armeabi-v7a x86
APP_MODULES := protobuf
  • 这里我弄了很久,原因是在cygwin中用ndk-build一直没有反应,但是hello-jni又是有效的,后来在stackoverflow中看到说如果使用NDK编译静态

    库要在Application. :mk中添加 APP_MODULES := module_name否则无法编译,动态库可以不用这个,简单的甚至不用Application.mk这个文件

1.6 使用cygwin 进入到protobuf文件夹,然后输入 ./configure

1.7 把上一步生成的config.h文件拷贝到jni文件下

1.8 在protobuf文件夹下运行ndk-build命令生成静态库文件,并且把静态库文件拷贝到我们项目下的libs文件夹下,比如反正proto文件夹下

proto 文件夹结构:

根目录:proto

一级子目录和文件:include,libs文件夹已经Android.mk文件

1.9 在protobuf文件夹下运行make && make install

1.10 实际上在1.9中也会生成libprotobuf.a文件,但是我主要是用来提取头文件,因为make install会把生成的lib文件和需要使用的头文件分别安装到cygwin的/usr/local/libusr/local/include其中include文件夹下的文件是我们需要的,把include文件夹放到1.8的proto文件夹下

1.11 在proto文件夹下创建一个Android.mk文件,内容如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := cocos_protobuf_static
LOCAL_MODULE_FILENAME := libprotobuf
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libprotobuf.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

2.protobuf 使用过程

2.1 在自己工程的Android.mk文件中添加以下代码

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_protobuf_static
$(call import-add-path,$(LOCAL_PATH)/../../)
$(call import-module,proto)
  • cocos_protobuf_static这个是1.11的LOCAL_MODULE
  • $(LOCAL_PATH)/../../这个路径是1.8的proto文件夹上一层路径
  • proto就是1.8的proto文件夹

protobuf使用NDK编译Android的静态库(工作记录)的更多相关文章

  1. android开发 NDK 编译和使用静态库、动态库 (转)

    在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...

  2. ndk编译android的lame库

    1.lame c库: https://github.com/intervigilium/liblame 下载后解压,进入目录,terminal里运行ndk-build即可 2.lame android ...

  3. Android NDK生成及连接静态库与动态库

    对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用.但是在某些情况下,我们需要借助C/C++来写JNI本地代码.比如,在使用跨平台的第三方库的时候:为了提升密集计算性能的时 ...

  4. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误

    在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...

  5. NDK jni 加载静态库

    加载静态库到android,静态库的提供方式有2种, a. 通过源文件来编译静态库 b. 加载已经编译好的静态库 首先我们来看,通过源文件来编译静态库,工程目录如下 第一步:我们来看我们的jni目录, ...

  6. iOS——为Xcode编译POCO C++静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  7. iOS - 编译WebRTC.a静态库

    编译WebRTC.a静态库 编译的方式,我看了几个帖子,什么方法都有,这里我根据我的需求,说说我的做法.我的主要目的是因为网上找不到.a模式的webrtc的静态库,都是framework,所以我才自己 ...

  8. ndk学习7: 使用静态库

    目录: 手工编译静态库 ndk-build编译静态库   手工编译静态库 老规矩还是先手工操作,知其然并知其所以然   需要用到的核心命令: gcc –g –c mod1.c mod2.c mod3. ...

  9. FFmpeg笔记:使用MSVC工具链编译Windows版本静态库、动态库

    2019年3月开始,为了将音视频编解码功能集成到Cocos2d-x中,开始接触到FFmpeg: 当时开发环境还在Mac下,编译FFmpeg相比现在用Windows平台要方便的多: 最近,公司内部有个U ...

随机推荐

  1. 【Sort】Merge Sort归并排序

    归并排序运行时间O(N log N),但是由于需要线性附加内存,所以很少用于主存排序. 算法核心在于以下三条语句,分治递归,分别对左半边和右半边的数组进行排序,然后把左右半边的数组一一进行比较放入数组 ...

  2. scale相关设置—手动设置

    在ggplot2 中,可以进行手动设置的函数有: scale_colour_manual(..., values).scale_fill_manual(..., values). scale_size ...

  3. ggplot2 scale相关设置-坐标转换

    ggplot2 scale相关设置-坐标转换 在R中坐标轴转换有多种形式,包括对数转换,平方根转换以及坐标刻度前后进行调换 用到的函数分别有: scale_x_log10(...) scale_y_l ...

  4. hdu_4417_Super Mario(主席树)

    题目链接:hdu_4417_Super Mario 题意: 给你n个树,有m个询问,每个询问有一个区间和一个k,问你这个区间内不大于k的数有多少个. 题解: 考虑用主席树的话就比较裸,当然也可以用其他 ...

  5. hdu_5904_LCIS(DP)

    题目链接:hdu_5904_LCIS 题意: 给你两串数,让你找这两串数的最长公共子序列,并且这个最长公共子序列是连续的数值 题解: 我们首先先分别处理出a,b的每个数的最长连续的长度 然后随便找一串 ...

  6. Webpack入门——使用Webpack打包Angular项目的一个例子

    2016.1.22,对大多数人来说,这是一个非常平常的日子,但这却是我决定在博客园写博客的日子.虽然注册博客园的博客已有4年8个月,却一直没有动手写过一篇博客,原因是觉得自己水平不行,写不出好东西,所 ...

  7. 面试中有关C++的若干问题

    面试中有关C++的若干问题 By 晴天, 2014.5.16晚 什么是多态?简要说一下C++中的多态的概念. (1)定义:多态是指相同对象收到不同消息或者不同对象收到相同消息产生不同的行为. (2)C ...

  8. poj 3278 Catch That Cow bfs

    Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...

  9. python 列表、字典的方法

    # 列表最后新增元素 li = [11, 22, 33] print(li) li.append(44) # 对原列表最后增加一个元素 print(li) 执行如下: [11, 22, 33][11, ...

  10. Openjudge-计算概论(A)-点与正方形的关系

    描述: 有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴.写一个程序,判断一个给定的点是否在这个正方形内.输入输入坐标x,y输出ye ...