JNI
JNI目录
Android.mk
类似于Makefile
设置LOCAL_PATH变量
LOCAL_PATH:=$(call my-dir)
##### libcurl.so #########
# 清除变量
include $(CLEAR_VARS)
# 编译的目标
LOCAL_MODULE := libcurl
# 参与编译的文件
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)
####### OBOjni.so ##########
# 清除变量
include $(CLEAR_VARS)
# 编译的目标
LOCAL_MODULE := OBOjni
# 参与编译的文件
LOCAL_SRC_FILES := Login.cpp Reg.cpp \
cJSON.cpp curlTest.cpp \
Json.cpp Curl.cpp \
Data.cpp StartOrder.cpp \
DriverLocationChanged.cpp \
PassengerLocationChanged.cpp \
FinishOrder.cpp
# 添加其他动态库
LOCAL_LDLIBS := -llog -lz
# 添加依赖的静态库
LOCAL_STATIC_LIBRARIES := libcurl
# 编译目标的类型 OBOjni.so
include $(BUILD_SHARED_LIBRARY)
Application.mk
指定编译的平台
APP_STL := stlport_static
APP_CFLAGS := -std=c++11
APP_ABI := armeabi
Data.cpp
-
JNI在和C++交互的时候即使是同一类型都是需要进行数据类型转换的,所以定义了一个Data类,这是一个单例类,用来存放sessionid,orderid,乘客/司机的状态机status,是否为司机IsDriver,乘客当前坐标和司机当前坐标
-
提供了许多方法目的是获取或者设置以上存放的数据,并将其转换为JNI需要的类型
#include "OBOJni.h" #include "Data.h" Data *Data::instance = NULL; extern "C" { JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getOrderid (JNIEnv *env, jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->getOrderid().c_str()); return retstr; } JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getSessionid (JNIEnv *env, jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->getSessionid().c_str()); return retstr; } JNIEXPORT void JNICALL Java_com_example_ace_obo_OBOJni_setStatus (JNIEnv *env, jobject obj, jstring jstatus) { const char *status = env->GetStringUTFChars(jstatus, NULL); Data::getInstance()->setStatus(status); env->ReleaseStringUTFChars(jstatus, status); } JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getStatus (JNIEnv *env, jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->getStatus().c_str()); return retstr; } JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getIsDriver (JNIEnv *env , jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->getIsDriver().c_str()); return retstr; } JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getPtempLongitude (JNIEnv *env, jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->get_ptemp_longitude().c_str()); return retstr; } JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getPtempLatitude (JNIEnv *env , jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->get_ptemp_latitude().c_str()); return retstr; } JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getDtempLongitude (JNIEnv *env, jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->get_dtemp_longitude().c_str()); return retstr; } JNIEXPORT jstring JNICALL Java_com_example_ace_obo_OBOJni_getDtempLatitude (JNIEnv *env, jobject obj) { //将char* 转换成jstring,供java使用 jstring retstr = env->NewStringUTF(Data::getInstance()->get_dtemp_latitude().c_str()); return retstr; } }
Login.cpp
-
拿到用户名密码角色信息,先保存角色信息并更新状态
//保存当前角色 Data::getInstance()->setIsDriver(isDriver); //设置当前的orderid为空 Data::getInstance()->setOrderid("NONE"); //更新当前角色状态 if (jisDriver == JNI_TRUE) { Data::getInstance()->setStatus(OBO_STATUS_DRIVER_IDLE); } else { Data::getInstance()->setStatus(OBO_STATUS_PASSNGER_IDLE); }
-
封装json发送给服务器等待响应
-
根据服务器响应数据,result为ok,将返回的sessionid设置进Data
-
失败时,根据reason字段输出失败原因
#include "OBOJni.h" #include "curl/curl.h" #include "cJSON.h" #include "Data.h" typedef struct login_response_data { login_response_data() { memset(data, 0, RESPONSE_DATA_LEN); data_len = 0; } char data[RESPONSE_DATA_LEN]; int data_len; }login_response_data_t; size_t curl_login_callback(char* ptr, size_t n, size_t m, void* userdata) { login_response_data_t *data = (login_response_data_t*)userdata; int response_data_len = n*m; memcpy(data->data+data->data_len, ptr, response_data_len); data->data_len+=response_data_len; return response_data_len; } extern "C" { /* * Class: com_example_ace_obo_Jni * Method: Login * Signature: ()I */ JNIEXPORT jboolean JNICALL Java_com_example_ace_obo_OBOJni_Login (JNIEnv *env, jobject obj, jstring jusername, jstring jpasswd, jboolean jisDriver) { const char *username = env->GetStringUTFChars(jusername, NULL); const char *passwd = env->GetStringUTFChars(jpasswd, NULL); const char *isDriver = (jisDriver==JNI_TRUE)?"yes":"no"; JNIINFO("LOGIN: username = %s, passwd = %s, isDriver = %s", username, passwd, isDriver); //保存当前角色 Data::getInstance()->setIsDriver(isDriver); //设置当前的orderid为空 Data::getInstance()->setOrderid("NONE"); //更新当前角色状态 if (jisDriver == JNI_TRUE) { Data::getInstance()->setStatus(OBO_STATUS_DRIVER_IDLE); } else { Data::getInstance()->setStatus(OBO_STATUS_PASSNGER_IDLE); } /* * 给服务端的协议 https://ip:port/login [json_data] * { username: "aaa