3

これは完全な警告です:

JNI 警告: インスタンス フィールド ID 0x571819bc は、クラス Ljava/lang/Class に対して無効です。in Lcom/brokenteapot/lwtemplate/JNI;.onCreate:(Landroid/content/res/AssetManager;)V (GetIntField)

そしてバックトレース:

#00  pc 00045dd0  /system/lib/libdvm.so (dvmAbort+75)
#01  pc 00039819  /system/lib/libdvm.so
#02  pc 0003e96b  /system/lib/libdvm.so
#03  pc 000089b9  /system/lib/libandroid.so (AAssetManager_fromJava+88)
#04  pc 00002f54  /data/data/com.brokenteapot.lwtemplate/lib/libLiveWallpaperTemplate.so (Java_com_brokenteapot_lwtemplate_JNI_onCreate+128)

原因となっているコードは次のとおりです。

ジャワ

public final class LiveWallpaperService extends WallpaperService 
{
    static AssetManager assetManager;

    @Override
    public void onCreate()
    {
        assetManager = getAssets();
        JNI.onCreate(assetManager);
    }
}

C++

void Java_com_brokenteapot_lwtemplate_JNI_onCreate(JNIEnv* env, jobject assetManager)
{
    AAssetManager* pAssetManager = AAssetManager_fromJava(env, assetManager);
}

その警告が何を意味するのか、なぜクラッシュするのか、私には本当にわかりません。私は NDK サンプルの例をほぼ正確にフォローしています。何か違うのはサービスだから?

4

1 に答える 1

0

うーん、私はそれを理解しました、メソッドシグネチャはJNI関数で間違っていました:

void Java_com_brokenteapot_lwtemplate_JNI_onCreate(JNIEnv* env, jobject assetManager)

になるはずだった

void Java_com_brokenteapot_lwtemplate_JNI_onCreate(JNIEnv* env, void* reserved, jobject assetManager)

一部のJNI関数がvoid*を必要とし、一部が必要としない理由がよくわかりません...

于 2012-11-01T20:57:08.657 に答える