Path: blob/v3_openjdk/app_pojavlauncher/src/main/jni/utils.c
2128 views
#include <jni.h>1#include <dlfcn.h>2#include <stdio.h>3#include <stdlib.h>4#include <unistd.h>56#include "log.h"78#include "utils.h"910typedef int (*Main_Function_t)(int, char**);11typedef void (*android_update_LD_LIBRARY_PATH_t)(char*);1213long shared_awt_surface;1415char** convert_to_char_array(JNIEnv *env, jobjectArray jstringArray) {16int num_rows = (*env)->GetArrayLength(env, jstringArray);17char **cArray = (char **) malloc(num_rows * sizeof(char*));18jstring row;1920for (int i = 0; i < num_rows; i++) {21row = (jstring) (*env)->GetObjectArrayElement(env, jstringArray, i);22cArray[i] = (char*)(*env)->GetStringUTFChars(env, row, 0);23}2425return cArray;26}2728jobjectArray convert_from_char_array(JNIEnv *env, char **charArray, int num_rows) {29jobjectArray resultArr = (*env)->NewObjectArray(env, num_rows, (*env)->FindClass(env, "java/lang/String"), NULL);30jstring row;3132for (int i = 0; i < num_rows; i++) {33row = (jstring) (*env)->NewStringUTF(env, charArray[i]);34(*env)->SetObjectArrayElement(env, resultArr, i, row);35}3637return resultArr;38}3940void free_char_array(JNIEnv *env, jobjectArray jstringArray, const char **charArray) {41int num_rows = (*env)->GetArrayLength(env, jstringArray);42jstring row;4344for (int i = 0; i < num_rows; i++) {45row = (jstring) (*env)->GetObjectArrayElement(env, jstringArray, i);46(*env)->ReleaseStringUTFChars(env, row, charArray[i]);47}48}4950jstring convertStringJVM(JNIEnv* srcEnv, JNIEnv* dstEnv, jstring srcStr) {51if (srcStr == NULL) {52return NULL;53}5455const char* srcStrC = (*srcEnv)->GetStringUTFChars(srcEnv, srcStr, 0);56jstring dstStr = (*dstEnv)->NewStringUTF(dstEnv, srcStrC);57(*srcEnv)->ReleaseStringUTFChars(srcEnv, srcStr, srcStrC);58return dstStr;59}6061JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_setupBridgeSurfaceAWT(JNIEnv *env, jclass clazz, jlong surface) {62shared_awt_surface = surface;63}6465JNIEXPORT jlong JNICALL Java_android_view_Surface_nativeGetBridgeSurfaceAWT(JNIEnv *env, jclass clazz) {66return (jlong) shared_awt_surface;67}6869JNIEXPORT jint JNICALL Java_android_os_OpenJDKNativeRegister_nativeRegisterNatives(JNIEnv *env, jclass clazz, jstring registerSymbol) {70const char *register_symbol_c = (*env)->GetStringUTFChars(env, registerSymbol, 0);71void *symbol = dlsym(RTLD_DEFAULT, register_symbol_c);72if (symbol == NULL) {73printf("dlsym %s failed: %s\n", register_symbol_c, dlerror());74return -1;75}7677int (*registerNativesForClass)(JNIEnv*) = symbol;78int result = registerNativesForClass(env);79(*env)->ReleaseStringUTFChars(env, registerSymbol, register_symbol_c);8081return (jint) result;82}8384JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_setLdLibraryPath(JNIEnv *env, jclass clazz, jstring ldLibraryPath) {85// jclass exception_cls = (*env)->FindClass(env, "java/lang/UnsatisfiedLinkError");8687android_update_LD_LIBRARY_PATH_t android_update_LD_LIBRARY_PATH;8889void *libdl_handle = dlopen("libdl.so", RTLD_LAZY);90void *updateLdLibPath = dlsym(libdl_handle, "android_update_LD_LIBRARY_PATH");91if (updateLdLibPath == NULL) {92updateLdLibPath = dlsym(libdl_handle, "__loader_android_update_LD_LIBRARY_PATH");93if (updateLdLibPath == NULL) {94char *dl_error_c = dlerror();95LOGE("Error getting symbol android_update_LD_LIBRARY_PATH: %s", dl_error_c);96// (*env)->ThrowNew(env, exception_cls, dl_error_c);97}98}99100android_update_LD_LIBRARY_PATH = (android_update_LD_LIBRARY_PATH_t) updateLdLibPath;101const char* ldLibPathUtf = (*env)->GetStringUTFChars(env, ldLibraryPath, 0);102android_update_LD_LIBRARY_PATH(ldLibPathUtf);103(*env)->ReleaseStringUTFChars(env, ldLibraryPath, ldLibPathUtf);104}105106JNIEXPORT jboolean JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_dlopen(JNIEnv *env, jclass clazz, jstring name) {107const char *nameUtf = (*env)->GetStringUTFChars(env, name, 0);108void* handle = dlopen(nameUtf, RTLD_GLOBAL | RTLD_LAZY);109if (!handle) {110LOGE("dlopen %s failed: %s", nameUtf, dlerror());111} else {112LOGD("dlopen %s success", nameUtf);113}114(*env)->ReleaseStringUTFChars(env, name, nameUtf);115return handle != NULL;116}117118JNIEXPORT jint JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_chdir(JNIEnv *env, jclass clazz, jstring nameStr) {119const char *name = (*env)->GetStringUTFChars(env, nameStr, NULL);120int retval = chdir(name);121(*env)->ReleaseStringUTFChars(env, nameStr, name);122return retval;123}124125JNIEXPORT jint JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_executeBinary(JNIEnv *env, jclass clazz, jobjectArray cmdArgs) {126jclass exception_cls = (*env)->FindClass(env, "java/lang/UnsatisfiedLinkError");127jstring execFile = (*env)->GetObjectArrayElement(env, cmdArgs, 0);128129char *exec_file_c = (char*) (*env)->GetStringUTFChars(env, execFile, 0);130void *exec_binary_handle = dlopen(exec_file_c, RTLD_LAZY);131132// (*env)->ReleaseStringUTFChars(env, ldLibraryPath, ld_library_path_c);133(*env)->ReleaseStringUTFChars(env, execFile, exec_file_c);134135char *exec_error_c = dlerror();136if (exec_error_c != NULL) {137LOGE("Error: %s", exec_error_c);138(*env)->ThrowNew(env, exception_cls, exec_error_c);139return -1;140}141142Main_Function_t Main_Function;143Main_Function = (Main_Function_t) dlsym(exec_binary_handle, "main");144145exec_error_c = dlerror();146if (exec_error_c != NULL) {147LOGE("Error: %s", exec_error_c);148(*env)->ThrowNew(env, exception_cls, exec_error_c);149return -1;150}151152int cmd_argv = (*env)->GetArrayLength(env, cmdArgs);153char **cmd_args_c = convert_to_char_array(env, cmdArgs);154int result = Main_Function(cmd_argv, cmd_args_c);155free_char_array(env, cmdArgs, cmd_args_c);156return result;157}158159JNIEnv* get_attached_env(JavaVM* jvm) {160JNIEnv *jvm_env = NULL;161jint env_result = (*jvm)->GetEnv(jvm, (void**)&jvm_env, JNI_VERSION_1_4);162if(env_result == JNI_EDETACHED) {163env_result = (*jvm)->AttachCurrentThread(jvm, &jvm_env, NULL);164}165if(env_result != JNI_OK) {166printf("get_attached_env failed: %i\n", env_result);167return NULL;168}169return jvm_env;170}171172// METHOD 2173/*174JNIEXPORT jint JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_executeForkedBinary(JNIEnv *env, jclass clazz, jobjectArray cmdArgs) {175int x, status;176x = fork();177if (x > 0) {178wait(&status);179} else {180execvpe();181}182return status;183}184*/185186187188