#include "jni.h" #include #include #include #include #include "log.h" #include "utils.h" CGFloat MathUtils_dist(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2) { const CGFloat x = (x2 - x1); const CGFloat y = (y2 - y1); return (CGFloat) hypot(x, y); } void _CGDataProviderReleaseBytePointerCallback(void *info,const void *pointer) { } char** convert_to_char_array(JNIEnv *env, jobjectArray jstringArray) { int num_rows = (*env)->GetArrayLength(env, jstringArray); char **cArray = (char **) malloc((num_rows + 1) * sizeof(char*)); jstring row; for (int i = 0; i < num_rows; i++) { row = (jstring) (*env)->GetObjectArrayElement(env, jstringArray, i); cArray[i] = (char*)(*env)->GetStringUTFChars(env, row, 0); } cArray[num_rows] = NULL; return cArray; } jobjectArray convert_from_char_array(JNIEnv *env, char **charArray, int num_rows) { jobjectArray resultArr = (*env)->NewObjectArray(env, num_rows, (*env)->FindClass(env, "java/lang/String"), NULL); jstring row; for (int i = 0; i < num_rows; i++) { row = (jstring) (*env)->NewStringUTF(env, charArray[i]); (*env)->SetObjectArrayElement(env, resultArr, i, row); } return resultArr; } void free_char_array(JNIEnv *env, jobjectArray jstringArray, char **charArray) { int num_rows = (*env)->GetArrayLength(env, jstringArray); jstring row; for (int i = 0; i < num_rows; i++) { row = (jstring) (*env)->GetObjectArrayElement(env, jstringArray, i); (*env)->ReleaseStringUTFChars(env, row, charArray[i]); } free(charArray); } CGFloat dpToPx(CGFloat dp) { CGFloat screenScale = [[UIScreen mainScreen] scale]; return dp * screenScale; } CGFloat pxToDp(CGFloat px) { CGFloat screenScale = [[UIScreen mainScreen] scale]; return px / screenScale; } jstring convertStringJVM(JNIEnv* srcEnv, JNIEnv* dstEnv, jstring srcStr) { if (srcStr == NULL) { return NULL; } const char* srcStrC = (*srcEnv)->GetStringUTFChars(srcEnv, srcStr, 0); jstring dstStr = (*dstEnv)->NewStringUTF(dstEnv, srcStrC); (*srcEnv)->ReleaseStringUTFChars(srcEnv, srcStr, srcStrC); return dstStr; } JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_setLdLibraryPath(JNIEnv *env, jclass clazz, jstring ldLibraryPath) { // jclass exception_cls = (*env)->FindClass(env, "java/lang/UnsatisfiedLinkError"); const char* ldLibPathUtf = (*env)->GetStringUTFChars(env, ldLibraryPath, 0); setenv("LD_LIBRARY_PATH", ldLibPathUtf, 1); (*env)->ReleaseStringUTFChars(env, ldLibraryPath, ldLibPathUtf); } JNIEXPORT jboolean JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_dlopen(JNIEnv *env, jclass clazz, jstring name) { const char *nameUtf = (*env)->GetStringUTFChars(env, name, 0); void* handle = dlopen(nameUtf, RTLD_GLOBAL | RTLD_LAZY); if (!handle) { printf("dlopen %s failed: %s\n", nameUtf, dlerror()); } else { printf("dlopen %s success\n", nameUtf); } (*env)->ReleaseStringUTFChars(env, name, nameUtf); return handle != NULL; } JNIEXPORT jint JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_chdir(JNIEnv *env, jclass clazz, jstring nameStr) { const char *name = (*env)->GetStringUTFChars(env, nameStr, NULL); int retval = chdir(name); (*env)->ReleaseStringUTFChars(env, nameStr, name); return retval; }