[Android]Android开发(三)

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值