android_net.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "android_native_app_glue.h"
  2. #include <iron_net.h>
  3. #include <iron_system.h>
  4. #include <jni.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. ANativeActivity *iron_android_get_activity(void);
  8. jclass iron_android_find_class(JNIEnv *env, const char *name);
  9. void iron_net_request(const char *url_base, const char *url_path, const char *data, int port, int method, iron_https_callback_t callback, void *callbackdata, const char *dst_path) {
  10. ANativeActivity *activity = iron_android_get_activity();
  11. JNIEnv *env;
  12. JavaVM *vm = iron_android_get_activity()->vm;
  13. (*vm)->AttachCurrentThread(vm, &env, NULL);
  14. jclass activityClass = iron_android_find_class(env, "arm.AndroidHttpRequest");
  15. jstring jurl_base = (*env)->NewStringUTF(env, url_base);
  16. jstring jurl_path = (*env)->NewStringUTF(env, url_path);
  17. jbyteArray bytes_array = (jbyteArray)((*env)->CallStaticObjectMethod(
  18. env, activityClass, (*env)->GetStaticMethodID(env, activityClass, "androidHttpRequest", "(Ljava/lang/String;Ljava/lang/String;)[B"), jurl_base,
  19. jurl_path));
  20. if (bytes_array == NULL) {
  21. callback(NULL, callbackdata);
  22. (*vm)->DetachCurrentThread(vm);
  23. return;
  24. }
  25. jsize num_bytes = (*env)->GetArrayLength(env, bytes_array);
  26. jbyte *elements = (*env)->GetByteArrayElements(env, bytes_array, NULL);
  27. if (elements != NULL) {
  28. if (dst_path != NULL) {
  29. FILE *file = fopen(dst_path, "wb");
  30. if (file != NULL) {
  31. fwrite((char *)elements, 1, num_bytes, file);
  32. fclose(file);
  33. }
  34. callback(NULL, callbackdata);
  35. }
  36. else {
  37. callback((char *)elements, callbackdata);
  38. }
  39. // (*env)->ReleaseByteArrayElements(env, bytes_array, elements, JNI_ABORT);
  40. }
  41. (*vm)->DetachCurrentThread(vm);
  42. }
  43. void iron_net_update() {
  44. }
  45. volatile uint64_t iron_net_bytes_downloaded = 0;