3

私が書いたAndroidコードのjniレイヤーで、jniレイヤーからjavaレイヤーに配列を返しています。結果を渡す前に、DeleteLocalRef()を使用してローカル参照を解放しています。自分が書いたコードが適切であることを確認したかっただけです。以下のコードを見つけてください。どんな助けでも大歓迎です。

extern "C"
{
JNIEXPORT jbyteArray JNICALL Java_com_jni_btRead(JNIEnv* env, jobject)
{

    unsigned char* reply = btRead();

    jbyteArray jba;
    if(reply)
    {       
        jba = env->NewByteArray(2048);
        env->SetByteArrayRegion(jba, 0, 2048, reinterpret_cast<jbyte*>(reply));
    }
    else
    {       
        jba = env->NewByteArray(0);
    }

    env->DeleteLocalRef(jba);
    return jba;
}
}
4

2 に答える 2

0

ここからの引用:

ローカル参照は、それを作成するネイティブ メソッドの動的コンテキスト内でのみ有効であり、ネイティブ メソッドのその 1 つの呼び出し内でのみ有効です。ネイティブ メソッドの実行中に作成されたすべてのローカル参照は、ネイティブ メソッドが戻ると解放されます。

したがって、ローカル参照は自動的に解放されるため、解放できない場合があります。

于 2012-05-29T11:11:51.060 に答える
0

ローカル変数は常にスタック セグメントで作成されるため、関数から戻った後に破棄されます。この図が役立つ場合があります。

ローカル変数の割り当て

于 2012-05-29T11:55:42.183 に答える