1

JavaがCで書かれたライブラリにアクセスできるようにするラッパーを書いています。

JNI呼び出しの間に永続的な配列が必要です。呼び出し間で配列アドレスを保持しています。この方法は非常にうまく機能します。私の主な関心事は、配列がJavaからjniにコピーされ、メモリがJVMによって解放されると同時に、コピーがヒープに残り、参照できるようになり、後で解放されることです。

ここに2つの機能があります。方法論は正しいですか、それともこれを達成するためのより効率的な方法がありますか?

Cへの配列のインポート:

JNIEXPORT jlong JNICALL
Java_Matcher_FlannLoadData(JNIEnv *env, jobject obj, jfloatArray d, jint r, jint c)
{
        int rows = (int)r;
        int cols = (int)c;

        float *jdataset = (*env)->GetFloatArrayElements(env,d,0);

        float *cdataset = malloc(rows*cols*sizeof(float));

        memcpy(cdataset,jdataset,rows*cols*sizeof(float));

        (*env)->ReleaseFloatArrayElements(env,d,jdataset,0);

        return (long)cdataset;
}

空きメモリ:

JNIEXPORT void JNICALL
Java_Matcher_FlannFreeData(JNIEnv *env, jobject obj, jlong d)
{
        free((float*)d)
}
4

1 に答える 1

0

私は

  1. jlongJavaデータのコピーを作成していると述べたように、Java側では何も必要なく、それをに返すだけです。FreeData
  2. 間接参照を使用しているため、Cスタイルのメモリ管理を主張しませんoperator->

そうです、これを行うためのより良い方法があります。必ずしもより「効率的」である必要はありませんが(意味によって異なります)、よりクリーンで読みやすくなります。

float *cdataset;

JNIEXPORT void JNICALL
Java_Matcher_FlannLoadData(JNIEnv *env, jobject obj, jfloatArray d, jint r, jint c)
{
    ...
    cdataset = new float[rows*cols];
    ...
}

JNIEXPORT void JNICALL
Java_Matcher_FlannFreeData(JNIEnv *env, jobject obj)
{
    delete [] cdataset;
}
于 2012-08-03T15:14:56.470 に答える