Skip to content

Commit 27d329c

Browse files
committed
[Android] Holding a VM reference to the asset manager jobject to prevent its being garbage collected
1 parent ce3b59a commit 27d329c

File tree

3 files changed

+16
-11
lines changed

3 files changed

+16
-11
lines changed

core/platform/android/FileUtils-android.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ THE SOFTWARE.
2828
#include "platform/Common.h"
2929
#include "platform/android/jni/JniHelper.h"
3030
#include "platform/android/jni/Java_dev_axmol_lib_AxmolEngine.h"
31-
#include "android/asset_manager.h"
32-
#include "android/asset_manager_jni.h"
3331
#include "base/ZipUtils.h"
3432

3533
#include <stdlib.h>
@@ -48,19 +46,28 @@ THE SOFTWARE.
4846

4947
namespace ax
5048
{
51-
49+
static jobject s_assetmanager_hold = nullptr;
5250
AAssetManager* FileUtilsAndroid::assetmanager = nullptr;
5351
ZipFile* FileUtilsAndroid::obbfile = nullptr;
5452

55-
void FileUtilsAndroid::setassetmanager(AAssetManager* a)
53+
void FileUtilsAndroid::setAssetManagerFromJava(jobject a)
5654
{
57-
if (nullptr == a)
55+
auto env = JniHelper::getEnv();
56+
if (!s_assetmanager_hold)
57+
s_assetmanager_hold = env->NewGlobalRef(a);
58+
/*
59+
Note: that the caller is responsible for obtaining and holding a VM reference to the jobject to
60+
prevent its being garbage collected while the native object is in use.
61+
refer: https://developer.android.com/ndk/reference/group/asset#aassetmanager_fromjava
62+
*/
63+
auto aassetMgr = AAssetManager_fromJava(env, s_assetmanager_hold);
64+
if (nullptr == aassetMgr)
5865
{
5966
LOGD("setassetmanager : received unexpected nullptr parameter");
6067
return;
6168
}
6269

63-
ax::FileUtilsAndroid::assetmanager = a;
70+
ax::FileUtilsAndroid::assetmanager = aassetMgr;
6471
}
6572

6673
FileUtils* FileUtils::getInstance()

core/platform/android/FileUtils-android.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
3232
#include <vector>
3333
#include <unordered_map>
3434
#include <memory>
35-
#include "jni.h"
36-
#include "android/asset_manager.h"
35+
#include <android/asset_manager_jni.h>
3736

3837
namespace ax
3938
{
@@ -57,7 +56,7 @@ class AX_DLL FileUtilsAndroid : public FileUtils
5756
*/
5857
virtual ~FileUtilsAndroid();
5958

60-
static void setassetmanager(AAssetManager* a);
59+
static void setAssetManagerFromJava(jobject a);
6160
static AAssetManager* getAssetManager() { return assetmanager; }
6261
static ZipFile* getObbFile() { return obbfile; }
6362

core/platform/android/jni/Java_dev_axmol_lib_AxmolEngine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ THE SOFTWARE.
2929
#include <string>
3030
#include "platform/android/jni/JniHelper.h"
3131
#include "platform/android/FileUtils-android.h"
32-
#include "android/asset_manager_jni.h"
3332
#include "platform/android/jni/Java_dev_axmol_lib_AxmolEngine.h"
3433

3534
#include "base/UTF8.h"
@@ -55,7 +54,7 @@ JNIEXPORT void JNICALL Java_dev_axmol_lib_AxmolEngine_nativeSetContext(JNIEnv* e
5554
jobject assetManager)
5655
{
5756
JniHelper::setClassLoaderFrom(context);
58-
FileUtilsAndroid::setassetmanager(AAssetManager_fromJava(env, assetManager));
57+
FileUtilsAndroid::setAssetManagerFromJava(assetManager);
5958
}
6059

6160
JNIEXPORT void JNICALL Java_dev_axmol_lib_AxmolEngine_nativeSetEditTextDialogResult(JNIEnv* env,

0 commit comments

Comments
 (0)