Я пытаюсь получить доступ к активам в собственном коде из пользовательского WallpaperService. Собственный код компилируется и работает, но попытка получить ссылку AAssetManager из объекта AssetManager, переданного в нативную функцию, всегда возвращает NULL.Невозможно получить доступ к AAssetManager в собственном коде, переданном из Java в WallpaperService
Это связано с тем, что я использую службу, а не активность, которая приводит к тому, что ссылка AAssetManager равна NULL? В источнике Java AssetManager, передаваемый в нативную функцию, действителен и не является нулевым.
Чтобы проверить это, я использовал их CubeLiveWallpaper демо из полученных образцов и ориентированных на уровень API 10. Здесь соответствующий код добавляется к классу CubeWallpaper1 для того, чтобы получить доступ к родной функциональности:
static {
System.loadLibrary("renderer");
}
private static native void load(AssetManager mgr);
@Override
public void onCreate() {
super.onCreate();
AssetManager mgr = getResources().getAssets();
load(mgr);
}
Вот является JNI код, я использую, чтобы попытаться получить действительную ссылку AAssetManager:
#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");
}
}
Это было воспроизведено на нескольких устройствах, но большинство испытаний было сделано на HTC Desire под управлением 2.3.7.
Имеет ли переменная mgr в коде Java что-то еще, кроме нуля? –
Да, делая Log.v на 'mgr' в Java-отчетах' android.content.res.AssetManager @ 405185e8' в DDMS. – cshaw