转载请注明原创地址:http://blog.csdn.net/iflychenyang/article/details/8548652
前言:
经过几天的努力终于将poco成功的在android平台上集成起来了.由于这段时间一直有事,没有及时对调研的结果进行总结,现对整个过程进行下整理.
1.我的前两篇博客(POCO C++库在Android 平台上集成1,2,以下称第一,二篇博客),是个错误的调研过程.
2.开始的时候是在mac os平台上编译的,编译出来了libPocoFoundation.a,libPocoNet.a,libPocoXML.a,libPocoData.a四个静态库,当然你也可以在windows平台上编译,但是我没有尝试,因为我一直做ios开发,刚开始做跨平台开发,对android不太熟悉,所以走了点弯路.
3.以上四个库在集成的时候,会报错,提示找不到头文件(ndk-build error: string: No such file or directory),其实是标准库没有编译链接进来,我以为是苹果系统上编译出来的不能用,所以又尝试用android.mk进行编译,这就是我的第二篇博客.其实第二种方式也是有问题的.
正文:
我现在集成通过了,正确方法是,先将poco编译成静态库,会产生四个文件libPocoFoundation.a,libPocoNet.a,libPocoXML.a,libPocoData.a,你可以通过linux,mac os或者windows平台编译出来,poco自身的makefile就可以编译通过,另外还需要一个libgnustl_static.a,将这五个静态库,与您自己的代码一起编译成动态库,再通过jni与android的java程序交互就可以了.
libgnustl_static.a这个库我是用android.mk文件编译(第二篇博客中的方法)时产生的obj文件夹中看到的,取出来就行了,您得自己想办法获取,在此我就不做介绍了.
编译动态库时的代码如下:
1.Android.mk
# Android.mk
# Copyright (C) 2013.
#
# All rights reserved.
# create by: yangchen (陈阳)
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -I$(LOCAL_PATH)/include
LOCAL_CPPFLAGS := -frtti -fexceptions
LOCAL_C_INCLUDES := $(LOCAL_PATH)\
$(LOCAL_PATH)/include
LOCAL_MODULE := HelloPoco-jni
LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -lPocoFoundation -lPocoNet -lPocoData -lPocoXML -lgnustl_static -llog
LOCAL_LDFLAGS = $(LOCAL_PATH)/lib/libPocoFoundation.a \
$(LOCAL_PATH)/lib/libPocoNet.a \
$(LOCAL_PATH)/lib/libgnustl_static.a
LOCAL_SRC_FILES := \
TestClass.cpp \
TestClassImpl.cpp\
hello-jni.cpp
include $(BUILD_SHARED_LIBRARY)
2.Application.mk
#
# Application.mk
#
# POCO Foundation 集成测试
#
# create by: yangchen (陈阳)
#
APP_CFLAGS += -fexceptions
APP_STL := gnustl_static
#include
#include
#include
#include
#include "TestClass.h"
#include
#include
#include
#include
#include "com_example_hellopoco_HelloPoco.h"
#include
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, "Test_JniSample_JNI", __VA_ARGS__))
static void printYear()
{
YANGCHEN::TestClass c;
LOGD("yangchen printYear %d",c.year());
}
static void testHttp()
{
YANGCHEN::TestClass c;
LOGD("yangchen testHttp begin");
std::string str = c.testHttpPost();
LOGD("yangchen testHttp end");
LOGD("yangchen testHttp.......................................:%s",str.c_str());
std::cout << "yangchen" << str << "testHttp2" << std::endl;
}
JNIEXPORT jint JNICALL Java_com_example_hellopoco_HelloPoco_testCallJava
(JNIEnv *env, jclass object)
{
LOGD("yangchen testCallJava begin");
printYear();
testHttp();
LOGD("yangchen testCallJava end");
return 0;
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_example_hellopoco_HelloPoco */
#ifndef _Included_com_example_hellopoco_HelloPoco
#define _Included_com_example_hellopoco_HelloPoco
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_hellopoco_HelloPoco
* Method: testCallJava
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_example_hellopoco_HelloPoco_testCallJava
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
5.HelloPoco.java
package com.example.hellopoco;
/**
* JNI测试类,包含典型的JAVA与C相互调用及数据转换示例
* @date 2012-12-24
* @author yangchen
*
*/
public class HelloPoco {
static {
System.loadLibrary("HelloPoco-jni");
}
public static native int testCallJava();
}
6.MainActivity.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread() {
public void run() {
HelloPoco.testCallJava();
}
}.start();
}