From 14671facef15076898a22c31dd739be6bc206c53 Mon Sep 17 00:00:00 2001 From: Joseph Cloutier Date: Tue, 7 Jun 2022 12:05:50 -0400 Subject: [PATCH] Parse JNI class names more intelligently. --- src/lime/system/JNI.hx | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lime/system/JNI.hx b/src/lime/system/JNI.hx index 1d240aff3..c511118e3 100644 --- a/src/lime/system/JNI.hx +++ b/src/lime/system/JNI.hx @@ -3,6 +3,8 @@ package lime.system; #if (!lime_doc_gen || android) import lime._internal.backend.native.NativeCFFI; +using StringTools; + /** The Java Native Interface (JNI) allows C++ code to call Java functions, and vice versa. On Android, Haxe code compiles to C++, but only Java code can @@ -31,6 +33,19 @@ class JNI private static var alreadyCreated = new Map(); private static var initialized = false; + private static function transformClassName(className:String):String + { + var parts:Array = className.split("."); + if (parts.length <= 1) + return className; + + var nestedClassName:String = ""; + if (~/^[A-Z]/.match(parts[parts.length - 2])) + nestedClassName = "$" + parts.pop(); + + return parts.join("/") + nestedClassName; + } + public static function callMember(method:Dynamic, jobject:Dynamic, a:Array):Dynamic { switch (a.length) @@ -86,6 +101,7 @@ class JNI init(); #if (android && lime_cffi && !macro) + className = transformClassName(className); return new JNIMemberField(NativeCFFI.lime_jni_create_field(className, memberName, signature, false)); #else return null; @@ -97,7 +113,7 @@ class JNI init(); #if (android && lime_cffi && !macro) - className = className.split(".").join("/"); + className = transformClassName(className); var handle = NativeCFFI.lime_jni_create_method(className, memberName, signature, false, quietFail); if (handle == null) @@ -122,6 +138,7 @@ class JNI init(); #if (android && lime_cffi && !macro) + className = transformClassName(className); return new JNIStaticField(NativeCFFI.lime_jni_create_field(className, memberName, signature, true)); #else return null; @@ -133,7 +150,7 @@ class JNI init(); #if (android && lime_cffi && !macro) - className = className.split(".").join("/"); + className = transformClassName(className); var handle = NativeCFFI.lime_jni_create_method(className, memberName, signature, true, quietFail); if (handle == null)