HttpRequestJavaTask.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "HttpRequestJavaTask.h"
  2. #include "core/log.h"
  3. namespace oxygine
  4. {
  5. jclass _jHttpRequestsClass = 0;
  6. jmethodID _jCreateRequestMethod = 0;
  7. void HttpRequestTask::init()
  8. {
  9. JNIEnv *env = jniGetEnv();
  10. LOCAL_REF_HOLDER(env);
  11. _jHttpRequestsClass = (jclass) env->NewGlobalRef(env->FindClass("org/oxygine/lib/HttpRequests"));
  12. JNI_NOT_NULL(_jHttpRequestsClass);
  13. _jCreateRequestMethod = env->GetStaticMethodID(_jHttpRequestsClass, "createRequest", "(Ljava/lang/String;Ljava/lang/String;[BJ)Lorg/oxygine/lib/HttpRequest;");
  14. JNI_NOT_NULL(_jCreateRequestMethod);
  15. jmethodID jInit = env->GetStaticMethodID(_jHttpRequestsClass, "init", "()V");
  16. JNI_NOT_NULL(jInit);
  17. env->CallStaticObjectMethod(_jHttpRequestsClass, jInit);
  18. log::messageln("initialized HttpRequestJavaTask");
  19. }
  20. void HttpRequestTask::release()
  21. {
  22. JNIEnv *env = jniGetEnv();
  23. LOCAL_REF_HOLDER(env);
  24. jmethodID jRelease = env->GetStaticMethodID(_jHttpRequestsClass, "release", "()V");
  25. JNI_NOT_NULL(jRelease);
  26. env->CallStaticObjectMethod(_jHttpRequestsClass, jRelease);
  27. }
  28. spHttpRequestTask HttpRequestTask::create()
  29. {
  30. return new HttpRequestJavaTask();
  31. }
  32. HttpRequestJavaTask::HttpRequestJavaTask():_handle(0)
  33. {
  34. }
  35. HttpRequestJavaTask::~HttpRequestJavaTask()
  36. {
  37. log::messageln("~HttpRequestJavaTask");
  38. }
  39. void HttpRequestJavaTask::_run()
  40. {
  41. addRef();
  42. _mainThreadSync = true;
  43. JNIEnv *env = jniGetEnv();
  44. LOCAL_REF_HOLDER(env);
  45. jstring jurl = jniGetEnv()->NewStringUTF(_url.c_str());
  46. jstring jfname = _fname.empty() ? 0 : jniGetEnv()->NewStringUTF(_fname.c_str());
  47. jbyteArray jpost = 0;
  48. if (!_postData.empty())
  49. {
  50. jpost = env->NewByteArray(_postData.size());
  51. env->SetByteArrayRegion(jpost, 0, _postData.size(), (jbyte*)&_postData.front());
  52. }
  53. _handle = env->NewGlobalRef(env->CallStaticObjectMethod(_jHttpRequestsClass, _jCreateRequestMethod, jurl, jfname, jpost, (jlong)this));
  54. }
  55. void HttpRequestJavaTask::error_()
  56. {
  57. onError();
  58. releaseRef();
  59. }
  60. void HttpRequestJavaTask::progress_(int loaded, int total)
  61. {
  62. progress(loaded, total);
  63. }
  64. void HttpRequestJavaTask::complete_(jbyteArray ar)
  65. {
  66. if (ar)
  67. {
  68. JNIEnv *env = jniGetEnv();
  69. jbyte *data = env->GetByteArrayElements(ar, 0);
  70. jint len = env->GetArrayLength(ar);
  71. _response.assign((char*)data, (char*)data + len);
  72. env->ReleaseByteArrayElements(ar, data, 0);
  73. }
  74. onComplete();
  75. releaseRef();
  76. }
  77. void HttpRequestJavaTask::_finaliaze(bool)
  78. {
  79. JNIEnv *env = jniGetEnv();
  80. env->DeleteGlobalRef(_handle);
  81. _handle = 0;
  82. }
  83. }
  84. extern "C"
  85. {
  86. JNIEnv* Android_JNI_GetEnv(void);
  87. JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestResponseSuccess(JNIEnv *env, jlong handle, jbyteArray array)
  88. {
  89. oxygine::HttpRequestJavaTask *task = (oxygine::HttpRequestJavaTask *)handle;
  90. task->complete_(array);
  91. }
  92. JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestResponseProgress(JNIEnv *env, jlong handle, jint loaded, jint total)
  93. {
  94. oxygine::HttpRequestJavaTask *task = (oxygine::HttpRequestJavaTask *)handle;
  95. task->progress_(loaded, total);
  96. }
  97. JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestResponseError(JNIEnv *env, jlong handle)
  98. {
  99. oxygine::HttpRequestJavaTask *task = (oxygine::HttpRequestJavaTask *)handle;
  100. task->error_();
  101. }
  102. }