From cb136e677f106ea07737db7be5dadf5b7ac2bc8d Mon Sep 17 00:00:00 2001 From: jfrijters Date: Thu, 30 Jul 2009 16:34:30 +0000 Subject: [PATCH] Fix for #2829717. Constructing java.lang.String instances should redirect to static helper method. --- runtime/JniInterface.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/runtime/JniInterface.cs b/runtime/JniInterface.cs index c2d8b312..3742278f 100644 --- a/runtime/JniInterface.cs +++ b/runtime/JniInterface.cs @@ -1616,10 +1616,14 @@ namespace IKVM.Runtime } internal static jobject AllocObject(JNIEnv* pEnv, jclass clazz) + { + return AllocObjectImpl(pEnv, TypeWrapper.FromClass(pEnv->UnwrapRef(clazz))); + } + + private static jobject AllocObjectImpl(JNIEnv* pEnv, TypeWrapper wrapper) { try { - TypeWrapper wrapper = TypeWrapper.FromClass(pEnv->UnwrapRef(clazz)); if(wrapper.IsAbstract) { SetPendingException(pEnv, new java.lang.InstantiationException(wrapper.Name)); @@ -1724,7 +1728,13 @@ namespace IKVM.Runtime internal static jobject NewObjectA(JNIEnv* pEnv, jclass clazz, jmethodID methodID, jvalue *args) { - jobject obj = AllocObject(pEnv, clazz); + TypeWrapper wrapper = TypeWrapper.FromClass(pEnv->UnwrapRef(clazz)); + if(!wrapper.IsAbstract && wrapper.TypeAsBaseType.IsAbstract) + { + // static newinstance helper method + return pEnv->MakeLocalRef(InvokeHelper(pEnv, IntPtr.Zero, methodID, args, false)); + } + jobject obj = AllocObjectImpl(pEnv, wrapper); if(obj != IntPtr.Zero) { InvokeHelper(pEnv, obj, methodID, args, false);