9

Android プロジェクトで助けが必要です。Java から jni にバッファーを渡したいのですが、私の C++ コードはデータを取り込みます。次に、Javaはそれらを画面に表示します。私は C++ にあまり詳しくなく、バッファに書き込む方法がわかりません。

これは私が得たものです。Javaで

ByteBuffer bb = ByteBuffer.allocateDirect(216);
        IssmJni.processBuffer(bb);

ネイティブメソッド

public static native void processBuffer(ByteBuffer bb);

jni_onload を使用しないため、C++ に javah はありません

static void fillBuffer(JNIEnv *env, jclass clazz, jobject buf)
    {
        double *dBuf = env->GetDirectBufferAddress(env, buf);

    }

ここで立ち往生しています。ダブルdbuf を実行できますか? それともcharでなければなりませんか?

この dbuf に 1,2,3,4,5 を書きたいとしましょう。私は dbuf.put(1); を考えています。... dbuf.put(5) ですが、動作していません。それを入力した後、Javaでbb.get(position)を呼び出すだけですか?

誰かが私のためにこれを明確にしてください、例をいただければ幸いですありがとう

これは私のネイティブメソッドの表です

static JNINativeMethod method_table[] = {

{"fac"      ,     "(J)J" , (void *) factorial},
    {"getBuffer",     "()[D" , (void *) getBufferNative},
    //{"processBuffer", "(Ljava/nio/ByteBuffer)V", (void *) fillBuffer}};

残りの 2 つは、最後の 1 つを除いて正常に動作します。

4

1 に答える 1

10

jni_onload を使用しないため、C++ に javah はありません

あなたの質問とは無関係かもしれませんが、どちらかをしなければなりません。onLoad 関数で Java からネイティブへのメソッド マッピングを行うか、javah を使用して JNI が実行時に取得できるメソッド シグネチャを生成する必要があります。そうしないと、ネイティブ メソッドが呼び出されません。

ただし、ネイティブ メソッドが適切に呼び出されている場合は、何を行っていてもおそらく問題ありません。

ここで立ち往生しています。ダブル dbuf を実行できますか? それともcharでなければなりませんか?

関数の戻り値は実際には であるvoid*ため、これは単なるメモリ アドレスであるため、任意のポインター型にキャストできます。ただし、ダイレクト バッファの実際のデータ型は でありjbyte、これは の typedef でsigned charあるため、おそらく次の方法が最適です。

jbyte *dBuf = env->GetDirectBufferAddress(env, buf);

この dbuf に 1,2,3,4,5 を書きたいとしましょう。

配列内の値にアクセスするための C/C++ での表記は、[] 表記です。

jbyte *dBuf = env->GetDirectBufferAddress(env, buf);

dBuf[0] = 63;
dBuf[1] = 127;
// ...and so on...

それを入力した後、Javaでbb.get(position)を呼び出すだけですか?

はい、アクセサ メソッドを使用してByteBuffer、ネイティブ コードから記述したデータにアクセスできます。

于 2012-11-14T20:41:47.933 に答える