[ https://issues.apache.org/jira/browse/PROTON-621?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Justin Ross updated PROTON-621: ------------------------------- Labels: android features patch (was: features github-import patch) > Added support for Android to Qpid-Proton0.6 > ------------------------------------------- > > Key: PROTON-621 > URL: https://issues.apache.org/jira/browse/PROTON-621 > Project: Qpid Proton > Issue Type: Improvement > Components: proton-c > Affects Versions: 0.6 > Environment: Android OS > Reporter: Jimmy Campbell > Labels: android, features, patch > Fix For: Future > > Original Estimate: 0h > Remaining Estimate: 0h > > The focus of this JIRA is for providing a method to build the Proton-C > library and get it running in the Android environment. I have forked the > Qpid-Proton repository and made a branch called AndroidProton that is based > off of 0.6. I have put together a little folder called proton-a which sits > inside the former 0.6 branch. Proton-a is the foundation for Proton on > Android. It contains a readme with instructions on how to build targeting > Android, the necessary files, and an example Android Project utilizing the > Proton-C library. I would like my changes to get pulled into the 0.6 branch > as an added feature. > https://github.com/jimmypc92/qpid-proton/tree/AndroidProton > Issues porting Proton-C to Android > The first issue of getting Proton-C working on Android was the lack of > openssl and uuid support. I fixed this by using open source implementations I > found online. My openssl for Android implementation was acquired off an old > github repository > "https://github/eighthave/openssl-android.git" > My uuid for Android implementation was acquired from AOSP > "android/platform/external/e2fsprogs/./lib/uuid" > Building the C libraries for Android > I built these libraries using the ndk-build system that comes with the > Android ndk. My folder comes with a README that links to the Android ndk if > one does not already have it. The README folder also has step-by-step > instructions for someone to build the library their selves. As I said, this > involves calling ndk-build 3 times. The user will build the openssl, then the > uuid, then the Proton-C libraries. The user can create their own java > bindings for calling the c library from Android by building the desktop > Qpid-Proton-0.6 with java swig bindings. Or they can use the jars that come > with my folder. > Changes > Every occurrence of getprotobyname("tcp")->p_proto had to be replaced with > IPPROTO_TCP in the source file proton-c/src/posix/driver.c This fix checks if > the source is being compiled with the NDK compiler to ensure that it doesn't > break the desktop build. The pre-processor definition for Android is > #ifdef __ANDROID__ > functional bug fix > The swig language binding jars produced with Qpid-Proton-0.6 build system > were causing a segfault whenever receiving a message that had the messageId > set to a generated uuid from the desktop Qpid-Proton-0.6 client. The error is > in JNIMessage.java in > qpid-proton-0.6/proton-c/bindings/java/src/main/java/org/apache/qpid/proton/messsage/jni. > at the convert method whenever type is a uuid. > The fix I used involved removing the use of pn_bytes_to_array in favor of > getting a pn_uuid_t from value (which is a pn_atom_t_u) and then getting the > byte array directly from the pn_uuid_t with the pn_uuid_t.getBytes() method > call. > {code:title=JNIMessage.java|borderStyle=solid} > else if(pn_type_t.PN_UUID.equals(type)) > { > pn_uuid_t uuidT = value.getAs_uuid(); > byte[] uuidBytes = uuidT.getBytes(); > -deleted- byte[] b = Proton.pn_bytes_to_array(value.getAs_bytes()); > ByteBuffer buf = ByteBuffer.wrap(uuidBytes); > return new UUID(buf.getLong(), buf.getLong()); > } > {code} > Example Android project > In the AndroidProtonBuild folder, a sample Android Proton project is included > that uses Proton-C. This project contains a file called UsingSwig.java which > exposes simple methods like send(). This sample project has a send and > receive button to check if the function is working with your target messaging > endpoint. The address to send and receive from must be specified in the > UsingSwig.java source file. > tip for native development on android > If you want to check for compilation by the NDK build system use > #ifdef __ANDROID__ > If you want to use eclipse and print to LogCat from C code, include the > following lines at the top of the source file: > #ifdef __ANDROID__ > #include <android/log.h> > #define LOG_TAG "my-log-tag" > #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) > #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) > #endif > These lines allow you to call LOGD([stringToPrint]); Which basically serves > as a printf, but to LogCat. It even allows formatting such as > LOGD("number of cars: %d", number_of_cars); > You can include these lines in any of the C source files you want to call > LOGD from. -- This message was sent by Atlassian JIRA (v6.3.4#6332) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org