1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-08-31 10:56:21 +00:00
Funkin/source/funkin/external/android/JNIUtil.hx

112 lines
4 KiB
Haxe

package funkin.external.android;
#if android
import lime.system.JNI;
/**
* A utility class for caching JNI method and field references.
*/
class JNIUtil
{
@:noCompletion
private static var staticMethodCache:Map<String, Dynamic> = [];
@:noCompletion
private static var memberMethodCache:Map<String, Dynamic> = [];
@:noCompletion
private static var staticFieldCache:Map<String, JNIStaticField> = [];
@:noCompletion
private static var memberFieldCache:Map<String, JNIMemberField> = [];
/**
* Retrieves or creates a cached static method reference.
*
* @param className The name of the Java class containing the method.
* @param methodName The name of the method.
* @param signature The method signature in JNI format.
* @param cache Whether to cache the result (default true).
* @return A dynamic reference to the static method.
*/
public static function createStaticMethod(className:String, methodName:String, signature:String, cache:Bool = true):Null<Dynamic>
{
@:privateAccess
className = JNI.transformClassName(className);
final key:String = '$className::$methodName::$signature';
if (cache && !staticMethodCache.exists(key)) staticMethodCache.set(key, JNI.createStaticMethod(className, methodName, signature));
else if (!cache) return JNI.createStaticMethod(className, methodName, signature);
return staticMethodCache.get(key);
}
/**
* Retrieves or creates a cached member method reference.
*
* @param className The name of the Java class containing the method.
* @param methodName The name of the method.
* @param signature The method signature in JNI format.
* @param cache Whether to cache the result (default true).
* @return A dynamic reference to the member method.
*/
public static function createMemberMethod(className:String, methodName:String, signature:String, cache:Bool = true):Null<Dynamic>
{
@:privateAccess
className = JNI.transformClassName(className);
final key:String = '$className::$methodName::$signature';
if (cache && !memberMethodCache.exists(key)) memberMethodCache.set(key, JNI.createMemberMethod(className, methodName, signature));
else if (!cache) return JNI.createMemberMethod(className, methodName, signature);
return memberMethodCache.get(key);
}
/**
* Retrieves or creates a cached static field reference.
*
* @param className The name of the Java class containing the field.
* @param fieldName The name of the field.
* @param signature The field signature in JNI format.
* @param cache Whether to cache the result (default true).
* @return A reference to the static field.
*/
public static function createStaticField(className:String, fieldName:String, signature:String, cache:Bool = true):Null<JNIStaticField>
{
@:privateAccess
className = JNI.transformClassName(className);
final key:String = '$className::$fieldName::$signature';
if (cache && !staticFieldCache.exists(key)) staticFieldCache.set(key, JNI.createStaticField(className, fieldName, signature));
else if (!cache) return JNI.createStaticField(className, fieldName, signature);
return staticFieldCache.get(key);
}
/**
* Retrieves or creates a cached member field reference.
*
* @param className The name of the Java class containing the field.
* @param fieldName The name of the field.
* @param signature The field signature in JNI format.
* @param cache Whether to cache the result (default true).
* @return A reference to the member field.
*/
public static function createMemberField(className:String, fieldName:String, signature:String, cache:Bool = true):Null<JNIMemberField>
{
@:privateAccess
className = JNI.transformClassName(className);
final key:String = '$className::$fieldName::$signature';
if (cache && !memberFieldCache.exists(key)) memberFieldCache.set(key, JNI.createMemberField(className, fieldName, signature));
else if (!cache) return JNI.createMemberField(className, fieldName, signature);
return memberFieldCache.get(key);
}
}
#end