POCO C++庫在Android 平臺上整合(3) (整合成功)
轉載請註明原創地址: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
3.Hello-jni.cpp
#include <string.h>
#include <jni.h>
#include <pthread.h>
#include <android/log.h>
#include "TestClass.h"
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "com_example_hellopoco_HelloPoco.h"
#include <iostream>
#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;
}
4.com_example_hellopoco_HelloPoco.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 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();
}