| 677 | } |
| 678 | |
| 679 | static int lua_java_array(lua_State* L) { |
| 680 | const char* class_name = luaL_checkstring(L, 1); |
| 681 | luaL_checktype(L, 2, LUA_TTABLE); |
| 682 | |
| 683 | JNIEnv* env = get_jni_env(); |
| 684 | if (!env) { |
| 685 | lua_pushnil(L); |
| 686 | lua_pushstring(L, "Failed to get JNIEnv"); |
| 687 | return 2; |
| 688 | } |
| 689 | |
| 690 | jclass element_class = find_class(env, class_name); |
| 691 | if (!element_class) { |
| 692 | lua_pushnil(L); |
| 693 | lua_pushfstring(L, "Class not found: %s", class_name); |
| 694 | return 2; |
| 695 | } |
| 696 | |
| 697 | int len = luaL_len(L, 2); |
| 698 | jobjectArray arr = (*env)->NewObjectArray(env, len, element_class, NULL); |
| 699 | if (!arr) { |
| 700 | lua_pushnil(L); |
| 701 | lua_pushstring(L, "Failed to create array"); |
| 702 | return 2; |
| 703 | } |
| 704 | |
| 705 | for (int i = 0; i < len; i++) { |
| 706 | lua_rawgeti(L, 2, i + 1); |
| 707 | if (lua_isuserdata(L, -1)) { |
| 708 | jobject* ud = (jobject*)lua_touserdata(L, -1); |
| 709 | (*env)->SetObjectArrayElement(env, arr, i, *ud); |
| 710 | } |
| 711 | lua_pop(L, 1); |
| 712 | } |
| 713 | |
| 714 | jobject global = (*env)->NewGlobalRef(env, arr); |
| 715 | (*env)->DeleteLocalRef(env, arr); |
| 716 | |
| 717 | jobject* result = (jobject*)lua_newuserdata(L, sizeof(jobject)); |
| 718 | *result = global; |
| 719 | luaL_getmetatable(L, JAVA_INSTANCE_MT); |
| 720 | lua_setmetatable(L, -2); |
| 721 | return 1; |
| 722 | } |
| 723 | |
| 724 | // Java.use("com.example.Class") -> JavaClassWrapper userdata |
| 725 | static int lua_java_use(lua_State* L) { |
nothing calls this directly
no test coverage detected