ndk编译jsoncpp

本例采用jsoncpp-src-0.6.0-rc2-amalgamation.tar

java调用语句

int id = 1001; 

        String name = "Kevin"; 

        String result =
system.toBuildJson(id, name); 

       
Log.i(TAG,String.format("Id:%1$d,Name:%2$s,The json formated string:%3$s",
id,name,result));

单写一个类来管理native函数如下

package com.mjson;

public class system {

static {

System.loadLibrary("jsoncpp");

System.loadLibrary("system");

}

public static native String toBuildJson(int id,String name);

}

配置好ndk和cywin(详见http://blog.csdn.net/pengchua/article/details/7582949
http://my.oschina.net/lifj/blog/177087

在cywin控制窗口cd到自己的项目下,如 /cygdrive/d/jdk/work/mJson/

javah -classpath bin/classes -d jni com.mJson.system

生成.h接口文件

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

#include <android/log.h>

#include "json/json.h"

#define  LOG_TAG    "system"

#define  LOGD(...) 
__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

/* Header for class com_mjson_system */

#ifndef _Included_com_mjson_system

#define _Included_com_mjson_system #ifdef __cplusplus

#endif

/*  * Class:     com_mjson_system  *
Method:    toBuildJson  * Signature:
(ILjava/lang/String;)Ljava/lang/String;  */

JNIEXPORT jstring JNICALL Java_com_mjson_system_toBuildJson   (JNIEnv *,
jclass, jint, jstring);

#ifdef __cplusplus

#endif #endif

本来对于JNIEXPORT jstring JNICALL Java_com_...这个函数需要entends
“c”{}包含,用于标识是c实现,便于编译成动态库,但是

由于我将函数的实现挪到了system.cpp中实现,所以此处去掉,将此加到system.cpp中,不然编译时会报冲突错误

systm.cpp如下

#include "com_mjson_system.h"

extern "C" {

JNIEXPORT jstring JNICALL Java_com_mjson_system_toBuildJson

(JNIEnv*  env, jobject thiz,jint id,jstring name){

jboolean isCopy = 0;

const char* c_name = env->GetStringUTFChars(name, &isCopy);

LOGD("on calling,id:%d,name:%s",id,c_name);

// to build a json object with id and name

Json::Value user;

user["id"] = id;

user["name"] = c_name;

const char* json_str = user.toStyledString().c_str();

jstring result = env->NewStringUTF(json_str);

env->ReleaseStringUTFChars(name,c_name);

return result;

}

}

在jni下新建Application

# it is needed for ndk-r5
#APP_STL := stlport_static
APP_STL :=
gnustl_static

在jni下新建Android.mk文件

在Makefile时注意路径

1、JsonCpp用到了stl的exception,所以如果你在android的编译系统的Application文件中指定STL库路径时,如果使用: APP_STL
:= stlport_static,那么就无法通过编译。需要改成:APP_STL := gnustl_static

2、jsoncpp的make
file。注意LOCAL_CPPFLAGS := -DJSON_IS_AMALGAMATION -fexceptions
这一行。宏定义JSON_IS_AMALGAMATION告诉jsoncpp是amalgamation版本,即是我们刚才下载的版本。-fexceptions则开启exception应用。

3、我们的测试程序的make
file。注意LOCAL_C_INCLUDES :=
$(LOCAL_PATH)/soncpp这一行,我们指定了头文件的地址为,当前路径(即$project/jni/test/)的上一级的jsoncpp文件夹,即$project/jni/jsoncpp/,这样在使用中我们需要inlcude的就是
"json/json.h"。

  1. LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../../libs/armeabi) \

  2. -ljsoncpp -llog

这里则指定使用的库libjsoncpp和liblog

4、java端的接口,注意加载库的先后顺序:

[java] view
plain
copy

  1. System.loadLibrary("jsoncpp");

  2. System.loadLibrary("main");

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := jsoncpp

LOCAL_CPPFLAGS := -DJSON_IS_AMALGAMATION -fexceptions

LOCAL_SRC_FILES := $(LOCAL_PATH)/jsoncpp/jsoncpp.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/jsoncpp/json

# it is used for ndk-r5

# if you build with ndk-r4, comment it

# because the new Windows toolchain doesn‘t support Cygwin‘s drive

# mapping (i.e /cygdrive/c/ instead of C:/)

#LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../libs/armeabi)

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS) LOCAL_MODULE := system

# for jsoncpp LOCAL_CPPFLAGS := -DJSON_IS_AMALGAMATION

LOCAL_SRC_FILES := system.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/jsoncpp

# it is used for ndk-r5

# if you build with ndk-r4, comment it

# because the new Windows toolchain doesn‘t support Cygwin‘s drive

# mapping (i.e /cygdrive/c/ instead of C:/)

LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/../libs/armeabi)
\                
-ljsoncpp -llog

include $(BUILD_SHARED_LIBRARY)

ndk编译jsoncpp,布布扣,bubuko.com

时间: 2024-08-11 05:45:48

ndk编译jsoncpp的相关文章

Android NDK 编译加入so文件

在cocos2d-x中集成百度语音识别的时候,运行build_native.py会把libs/armeabi目录清空. 以下是解决办法,把so文件放在jni/prebuilt里面. 修改Android.mk文件,主要有两行include $(CLEAR_VARS) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #百度语音识别so LOCAL_MODULE := BDVoiceRecognitionClient_V1 LOCAL_SRC_FI

[原]如何用Android NDK编译FFmpeg

\我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的NDK编译出来可以在Android下面可以使用的FFmpeg动态链接库呢?写下这篇文章就是学习如何裁剪并且编译出来可以使用的动态库. 一.获取FFmpeg源码: 首先在编译之前,得获取一份FFmpeg的源码,如果你没有git并且也不打算使用,你可以去FFmpeg官网http://ffmpeg.org/

使用Android Studio自带的NDK编译JNI

/********************************************************************************** * 使用Android Studio自带的NDK编译JNI * 说明: * 省得自己另外去下载NDK,编译JNI,麻烦. * * 2017-4-30 深圳 龙华民治樟坑村 曾剑锋 ****************************************************************************

一个小玩具:NDK编译FFmpeg的例子

FFmpeg NDK编译 和最简单的APK 准备 硬件: 一台电脑,实验在Lenovo T430上 一个Android设备,实验在 三星S3/A7 编译环境: Ubuntu 14.04 (ant\java等命令必须支持) 工具包: NDK: https://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86_64.tar.bz2 SDK:https://dl.google.com/android/adt/adt-bundle-linux-

[Android]Cygwin使用及NDK编译方法

在Windows XP, Cygwin, NDK SDK r5b下成功编译了ffmpeg,下面是完整的编译过程: 一.准备工作 2.下载Cygwin, 请猛击这里 3.下载Android SDK,请猛击这里,Android SDK的网页 4.下载Android NDK SDK r5b, 请猛击这里,NDK SDK的网页 5.下载ffmpeg,可以下载压缩包,也可以git一个snapshot 好了,有必要说明一下Android SDK和Android NDK SDK的区别: Android SDK

工作积累之NDK编译STL (zhuan)

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnust

anroid ndk编译ffmpeg 引用librtmp libx264

Ffmpeg 无处不在,自然android系统少不了它,折腾了不少时间完成 ndk编译ffmpeg,生成so库中引用了外部库librtmp,libx264.条条大路通罗马, 也许还有别的更好的方法去完成它,我没有仔细研究.我使用的方法完全可以达到我的预期目的. 一.选择编译环境 可以选择windows下cygwin,也可以选择linux系统,我建议选择后者.花了很多时间在cygwin下编译,configure时总是提示链接需要的so文件找不到.无奈 之下转到linux环境下编译.我用的版本是ub

NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

由于使用了NDK编译的可执行文件在应用中调用,在Android 7.0上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent executables (PIE) are supported. PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译出的.因此不会报错.但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行.解决办法非常简单,在A

levmar ndk 编译

levmar是一个强大的和高效率的C/C++库,采用Levenberg - 马奎德(LM)优化算法, 主要是为了解决非线性最小二乘问题.官网是:http://users.ics.forth.gr/~lourakis/levmar/ 在PC引用,网上有挺多的资料可以查询到,但我想应用到Android上来,google了一下,找不到太多资料,只有一个国外几年前的项目:https://github.com/3deggi/levmar-ndk 因为项目太久远,还是采用 eclipse IDE来开发的,我