HttpRequestJavaTask.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "HttpRequestJavaTask.h"
  2. #include "core/log.h"
  3. namespace oxygine
  4. {
  5. jclass _jHttpRequestsClass = 0;
  6. jmethodID _jCreateRequestMethod = 0;
  7. static HttpRequestTask* createTask()
  8. {
  9. return new HttpRequestJavaTask;
  10. }
  11. void HttpRequestTask::init()
  12. {
  13. setCustomRequests(createTask);
  14. JNIEnv* env = jniGetEnv();
  15. LOCAL_REF_HOLDER(env);
  16. _jHttpRequestsClass = (jclass) env->NewGlobalRef(env->FindClass("org/oxygine/lib/HttpRequests"));
  17. JNI_NOT_NULL(_jHttpRequestsClass);
  18. _jCreateRequestMethod = env->GetStaticMethodID(_jHttpRequestsClass, "createRequest",
  19. "(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[BJ)Lorg/oxygine/lib/HttpRequestHolder;");
  20. JNI_NOT_NULL(_jCreateRequestMethod);
  21. jmethodID jInit = env->GetStaticMethodID(_jHttpRequestsClass, "init", "()V");
  22. JNI_NOT_NULL(jInit);
  23. env->CallStaticVoidMethod(_jHttpRequestsClass, jInit);
  24. log::messageln("initialized HttpRequestJavaTask");
  25. }
  26. void HttpRequestTask::release()
  27. {
  28. JNIEnv* env = jniGetEnv();
  29. LOCAL_REF_HOLDER(env);
  30. jmethodID jRelease = env->GetStaticMethodID(_jHttpRequestsClass, "release", "()V");
  31. JNI_NOT_NULL(jRelease);
  32. env->CallStaticVoidMethod(_jHttpRequestsClass, jRelease);
  33. env->DeleteGlobalRef(_jHttpRequestsClass);
  34. _jHttpRequestsClass = 0;
  35. _jCreateRequestMethod = 0;
  36. }
  37. HttpRequestJavaTask::HttpRequestJavaTask(): _handle(0)
  38. {
  39. }
  40. HttpRequestJavaTask::~HttpRequestJavaTask()
  41. {
  42. }
  43. void HttpRequestJavaTask::_run()
  44. {
  45. JNIEnv* env = jniGetEnv();
  46. LOCAL_REF_HOLDER(env);
  47. jstring jurl = env->NewStringUTF(_url.c_str());
  48. jbyteArray jpost = 0;
  49. if (!_postData.empty())
  50. {
  51. jpost = env->NewByteArray(_postData.size());
  52. env->SetByteArrayRegion(jpost, 0, _postData.size(), (jbyte*)&_postData.front());
  53. }
  54. jobjectArray jkeys = (jobjectArray)env->NewObjectArray(_headers.size(), env->FindClass("java/lang/String"), 0);
  55. jobjectArray jvalues = (jobjectArray)env->NewObjectArray(_headers.size(), env->FindClass("java/lang/String"), 0);
  56. for (size_t i = 0; i < _headers.size(); ++i)
  57. {
  58. jstring jkey = env->NewStringUTF(_headers[i].first.c_str());
  59. jstring jvalue = env->NewStringUTF(_headers[i].second.c_str());
  60. env->SetObjectArrayElement(jkeys, i, jkey);
  61. env->SetObjectArrayElement(jvalues, i, jvalue);
  62. }
  63. //addRef();
  64. void* ptr = new spAsyncTask(shared_from_this());
  65. _handle = env->NewGlobalRef(env->CallStaticObjectMethod(_jHttpRequestsClass, _jCreateRequestMethod,
  66. jurl, jkeys, jvalues, jpost, (jlong)ptr));
  67. }
  68. void HttpRequestJavaTask::error_()
  69. {
  70. onError();
  71. //releaseRef();
  72. }
  73. void HttpRequestJavaTask::gotHeader_(int respCode, int contentLen)
  74. {
  75. _responseCode = respCode;
  76. _expectedContentSize = contentLen;
  77. gotHeaders();
  78. }
  79. void HttpRequestJavaTask::write_(jbyteArray jdata, int size)
  80. {
  81. JNIEnv* env = jniGetEnv();
  82. jbyte* data = env->GetByteArrayElements(jdata, 0);
  83. write(data, size);
  84. env->ReleaseByteArrayElements(jdata, data, JNI_ABORT);
  85. }
  86. void HttpRequestJavaTask::complete_()
  87. {
  88. onComplete();
  89. //releaseRef();
  90. }
  91. void HttpRequestJavaTask::_finaliaze(bool)
  92. {
  93. JNIEnv* env = jniGetEnv();
  94. env->DeleteGlobalRef(_handle);
  95. _handle = 0;
  96. }
  97. }
  98. extern "C"
  99. {
  100. /*
  101. public static native void nativeHttpRequestSuccess(long handle);
  102. public static native void nativeHttpRequestError(long handle);
  103. public static native void nativeHttpRequestGotHeader(long handle, int code, int contentLength);
  104. public static native void nativeHttpRequestWrite(long handle, byte[] data, int size);
  105. */
  106. JNIEnv* Android_JNI_GetEnv(void);
  107. JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestSuccess(JNIEnv* env, jclass, jlong handle)
  108. {
  109. oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
  110. static_cast<oxygine::HttpRequestJavaTask*>(task->get())->complete_();
  111. delete task;
  112. //task->complete_();
  113. }
  114. JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestError(JNIEnv* env, jclass, jlong handle)
  115. {
  116. oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
  117. static_cast<oxygine::HttpRequestJavaTask*>(task->get())->error_();
  118. delete task;
  119. }
  120. JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestWrite(JNIEnv* env, jclass,
  121. jlong handle, jbyteArray array, jint size)
  122. {
  123. oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
  124. static_cast<oxygine::HttpRequestJavaTask*>(task->get())->write_(array, size);
  125. }
  126. JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestGotHeader(JNIEnv* env, jclass,
  127. jlong handle, jint respCode, jint contentLen)
  128. {
  129. oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
  130. static_cast<oxygine::HttpRequestJavaTask*>(task->get())->gotHeader_(respCode, contentLen);
  131. }
  132. }