gpt4 book ai didi

android - 无法访问 WallpaperService 中从 Java 传递的 native 代码中的 AAssetManager

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:24:44 25 4
gpt4 key购买 nike

我正在尝试从自定义 WallpaperService 访问 native 代码中的 Assets 。 native 代码编译并工作,但尝试从传递给 native 函数的 AssetManager 对象获取 AAssetManager 引用总是返回 NULL。

这是否与我使用服务而不是导致 AAssetManager 引用为 NULL 的 Activity 有关?在 Java 源代码中,传递给 native 函数的 AssetManager 有效且不为空。

为了测试这一点,我使用了他们提供的样本中的 CubeLiveWallpaper 演示,目标 API 级别 10。以下是添加到 CubeWallpaper1 类的相关代码,以访问 native 功能:

static {
System.loadLibrary("renderer");
}

private static native void load(AssetManager mgr);

@Override
public void onCreate() {
super.onCreate();

AssetManager mgr = getResources().getAssets();
load(mgr);
}

这是我用来尝试获取有效 AAssetManager 引用的 JNI 代码:

#include <jni.h>
#include <android/log.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>

#define TAG "CubeWallpaper1.c"

void
Java_com_example_android_livecubes_cube1_CubeWallpaper1_load(JNIEnv *env,
jobject assetManager) {

AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);
if (mgr == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "CubeWallpaper1.c", "error loading asset maanger");
} else {
__android_log_print(ANDROID_LOG_VERBOSE, "CubeWallpaper1.c", "loaded asset manager");
}

}

这已在几台设备上进行了复制,但大部分测试是在运行 2.3.7 的 HTC Desire 上完成的。

最佳答案

阅读 asset_manager_jni.h 中的注释:“请注意,调用者负责获取并保存对 jobject 的 VM 引用,以防止在使用 native 对象时对其进行垃圾回收。”

在 Java 中,您正在传递一个对象 (mgr),一旦调用 native 回调,该对象可能会被垃圾收集器释放。为了防止这种情况,例如,您可以在类中创建 mgr 变量作为私有(private)属性,然后通过加载方法传递它,例如:

private static native void load(AssetManager mgr);

private AssetManager mgr;

@Override
public void onCreate() {
super.onCreate();

mgr = getResources().getAssets();
load(mgr);
}

此外,我认为您必须将原生 C++ 回调替换为:

void Java_com_example_android_livecubes_cube1_CubeWallpaper1_load
(JNIEnv *env, jobject obj, jobject assetManager)

关于android - 无法访问 WallpaperService 中从 Java 传递的 native 代码中的 AAssetManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com