X-Git-Url: http://nitlanguage.org diff --git a/lib/android/assets_and_resources.nit b/lib/android/assets_and_resources.nit index ef78d72..ae124ba 100644 --- a/lib/android/assets_and_resources.nit +++ b/lib/android/assets_and_resources.nit @@ -25,8 +25,8 @@ module assets_and_resources import native_app_glue -import java_io import java +import java::io in "Java" `{ import android.content.res.AssetManager; @@ -46,7 +46,6 @@ in "Java" `{ # This is a low-level class, use `AssetManager` instead extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `} super JavaObject - redef type SELF: NativeAssetManager fun close in "Java" `{ recv.close(); `} @@ -103,6 +102,13 @@ extern class NativeAssetManager in "Java" `{ android.content.res.AssetManager `} } return afd; `} + + # HACK for bug #845 + redef fun new_global_ref import sys, Sys.jni_env `{ + Sys sys = NativeResources_sys(recv); + JNIEnv *env = Sys_jni_env(sys); + return (*env)->NewGlobalRef(env, recv); + `} end # Assets manager using a `NativeAssetManager` to manage android assets @@ -139,14 +145,18 @@ class AssetManager # Open an asset using ACCESS_STREAMING mode, returning a NativeInputStream fun open(file_name: String): NativeInputStream do + sys.jni_env.push_local_frame(1) var return_value = native_assets_manager.open(file_name.to_java_string) + sys.jni_env.pop_local_frame return return_value end # Open an asset using it's name and returning a NativeAssetFileDescriptor # `file_name` is fun open_fd(file_name: String): NativeAssetFileDescriptor do - var return_value = native_assets_manager.open_fd(file_name.to_java_string) + sys.jni_env.push_local_frame(1) + var return_value = native_assets_manager.open_fd(file_name.to_java_string).new_global_ref + sys.jni_env.pop_local_frame return return_value end @@ -159,7 +169,7 @@ class AssetManager # Return a bitmap from the assets fun bitmap(name: String): NativeBitmap do sys.jni_env.push_local_frame(1) - var return_value = new NativeBitmap.from_stream(native_assets_manager.open(name.to_java_string)) + var return_value = new NativeBitmap.from_stream(native_assets_manager.open(name.to_java_string)).new_global_ref sys.jni_env.pop_local_frame return return_value end @@ -172,20 +182,26 @@ end # This is a low-level class, use `ResourcesManager` instead extern class NativeResources in "Java" `{ android.content.res.Resources `} super JavaObject - redef type SELF: NativeResources fun get_assets:NativeAssetManager in "Java" `{ return recv.getAssets(); `} - fun get_color(id: Int): Int in "Java" `{ return recv.getColor(id); `} - fun get_boolean(id: Int): Bool in "Java" `{ return recv.getBoolean(id); `} - fun get_dimension(id: Int): Int in "Java" `{ return (int)recv.getDimension(id); `} - fun get_drawable(id: Int): NativeDrawable in "Java" `{ return recv.getDrawable(id); `} + fun get_color(id: Int): Int in "Java" `{ return recv.getColor((int)id); `} + fun get_boolean(id: Int): Bool in "Java" `{ return recv.getBoolean((int)id); `} + fun get_dimension(id: Int): Int in "Java" `{ return (int)recv.getDimension((int)id); `} + fun get_drawable(id: Int): NativeDrawable in "Java" `{ return recv.getDrawable((int)id); `} fun get_identifier(name, def_type, def_package: JavaString): Int in "Java" `{ return recv.getIdentifier(name, def_type, def_package); `} - fun get_integer(id: Int): Int in "Java" `{ return recv.getInteger(id); `} - fun get_string(id: Int): JavaString in "Java" `{ return recv.getString(id); `} - fun get_resource_entry_name(resid: Int): JavaString in "Java" `{ return recv.getResourceEntryName(resid); `} - fun get_resource_name(resid: Int): JavaString in "Java" `{ return recv.getResourceName(resid); `} - fun get_resource_pakage_name(resid: Int): JavaString in "Java" `{ return recv.getResourcePackageName(resid); `} - fun get_resource_type_name(resid: Int): JavaString in "Java" `{ return recv.getResourceTypeName(resid); `} + fun get_integer(id: Int): Int in "Java" `{ return recv.getInteger((int)id); `} + fun get_string(id: Int): JavaString in "Java" `{ return recv.getString((int)id); `} + fun get_resource_entry_name(resid: Int): JavaString in "Java" `{ return recv.getResourceEntryName((int)resid); `} + fun get_resource_name(resid: Int): JavaString in "Java" `{ return recv.getResourceName((int)resid); `} + fun get_resource_pakage_name(resid: Int): JavaString in "Java" `{ return recv.getResourcePackageName((int)resid); `} + fun get_resource_type_name(resid: Int): JavaString in "Java" `{ return recv.getResourceTypeName((int)resid); `} + + # HACK for bug #845 + redef fun new_global_ref import sys, Sys.jni_env `{ + Sys sys = NativeResources_sys(recv); + JNIEnv *env = Sys_jni_env(sys); + return (*env)->NewGlobalRef(env, recv); + `} end # Resource manager for android resources placed in the `res` folder of your app @@ -276,7 +292,6 @@ end # An android Bitmap, get an instance using the AssetManager or the ResourceManager extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `} super JavaObject - redef type SELF: NativeBitmap # Create a NativeBitmap from a NativeInputStream retrieved with `open` function of the AssetManager # Called by the AssetManager @@ -284,15 +299,22 @@ extern class NativeBitmap in "Java" `{ android.graphics.Bitmap `} # Create a NativeBitmap using a resource ID and the NativeResources # Called by the ResourceManager - new from_resources(res: NativeResources, id: Int) in "Java" `{ return BitmapFactory.decodeResource(res, id); `} + new from_resources(res: NativeResources, id: Int) in "Java" `{ return BitmapFactory.decodeResource(res, (int)id); `} fun width: Int in "Java" `{ return recv.getWidth(); `} fun height: Int in "Java" `{ return recv.getHeight(); `} + + # HACK for bug #845 + redef fun new_global_ref import sys, Sys.jni_env `{ + Sys sys = NativeResources_sys(recv); + JNIEnv *env = Sys_jni_env(sys); + return (*env)->NewGlobalRef(env, recv); + `} + end # Android AssetFileDescriptor, can be retrieve by AssetManager and used to load a sound in a SoundPool extern class NativeAssetFileDescriptor in "Java" `{ android.content.res.AssetFileDescriptor `} super JavaObject - redef type SELF: NativeAssetFileDescriptor fun close in "Java" `{ try { @@ -334,6 +356,13 @@ extern class NativeAssetFileDescriptor in "Java" `{ android.content.res.AssetFil fun length: Int in "Java" `{ return (int)recv.getLength(); `} fun start_offset: Int in "Java" `{ return (int)recv.getStartOffset(); `} redef fun to_s: String import JavaString.to_s in "Java" `{ return JavaString_to_s(recv.toString()); `} + + # HACK for bug #845 + redef fun new_global_ref import sys, Sys.jni_env `{ + Sys sys = NativeResources_sys(recv); + JNIEnv *env = Sys_jni_env(sys); + return (*env)->NewGlobalRef(env, recv); + `} end # Native class representing something drawable, can be retrieved from the resources @@ -343,10 +372,10 @@ end redef class App # Resource Manager used to manage resources placed in the `res` folder of the app - fun resource_manager: ResourcesManager is cached do return new ResourcesManager(self.resources, self.package_name.to_s) + var resource_manager: ResourcesManager is lazy do return new ResourcesManager(self.resources, self.package_name.to_s) # Assets Manager used to manage resources placed in the `assets` folder of the app - fun asset_manager: AssetManager is cached do return new AssetManager(self) + var asset_manager: AssetManager is lazy do return new AssetManager(self) # Get the native AssetsManager of the application, used to initialize the nit's AssetManager private fun assets: NativeAssetManager import native_activity in "Java" `{ return App_native_activity(recv).getAssets(); `}