Files
PojavLauncher_iOS/Natives/utils.m
T
Duy Tran Khanh 984647084b Fixes
- [Internal] Changed how setting current viewController work
- [Internal] Correct 018e46a: avoid duplicating code
- [Internal] Saving JSON now uses NSData to write directly
- Correct a check of the Launch .jar option
- Set the AWT window size for the game
2022-05-27 21:54:26 +07:00

142 lines
4.6 KiB
Objective-C

#include "jni.h"
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "log.h"
#include "utils.h"
NSMutableDictionary* parseJSONFromFile(NSString *path) {
NSError *error;
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (content == nil) {
NSLog(@"[ParseJSON] Error: could not read %@: %@", path, error.localizedDescription);
return [@{@"error": error} mutableCopy];
}
NSData* data = [content dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error) {
NSLog(@"[ParseJSON] Error: could not parse JSON: %@", error.localizedDescription);
return [@{@"error": error} mutableCopy];
}
return dict;
}
NSError* saveJSONToFile(NSDictionary *dict, NSString *path) {
// TODO: handle rename
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
if (jsonData == nil) {
return error;
}
BOOL success = [jsonData writeToFile:path options:NSDataWritingAtomic error:&error];
if (!success) {
return error;
}
return nil;
}
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);
}
//Ported from https://www.arduino.cc/reference/en/language/functions/math/map/
CGFloat MathUtils_map(CGFloat x, CGFloat in_min, CGFloat in_max, CGFloat out_min, CGFloat out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
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;
}