2

Java コード:

package library;

import java.nio.ByteBuffer;

public class Library
{    
    static{System.loadLibrary("TestDLL");}

    native static void GetGLBuffer(ByteBuffer Buffer, int Width, int Height, int Size);

    public static void main(String[] args) {

        ByteBuffer B = ByteBuffer.allocateDirect(5);
        byte[] C = {'H', 'E', 'R', 'E', '\0'};
        B.put(C);
        GetGLBuffer(B, 0, 0, 4);
        System.out.println((char)B.get(0));
    }
}

C++ コード:

JNIEXPORT void JNICALL Java_library_Library_GetGLBuffer(JNIEnv *env, jclass cls, jobject buffer, jint Width, jint Height, jint Size)
{
    unsigned char* Buff = (unsigned char*)env->GetDirectBufferAddress(buffer);
    //*Buff = 'A'; Crashes it.
    //Buff[0] = 'A'; Crashes it.
    //std::cout<<Buff[0]; Prints fine but crashes when this function ends.
}

私が何もしなければ、それは完全にうまくいきます。また、上記の関数内で変数を宣言すると、クラッシュします。

どうすれば修正できますか?私は何か間違ったことをしていますか?

このファイルを出力します: http://pastebin.com/Mz76Bk8G

4

2 に答える 2

0

私はそれを解決したと言いたいだけです。JNI フォルダーに移動し、JDK 7 の JNI.h と JNI_MD.h を C++ プロジェクト フォルダーにコピーし、それをファイルとして含め、.def ファイルを使用してエクスポートする必要がありました。

上記の手順をすべて実行しないと、JVM がクラッシュしました。理由はわかりませんが、機能することをうれしく思います。同じ問題を抱えている他の人がそれを修正できるように、これを投稿します。

ビューの人に感謝します。何が間違っているのかを理解するのは非常に困難でした。このコメントが他の人に役立つことを願っています。

于 2012-09-30T20:17:08.693 に答える
0

問題は、バイトの配列を C 関数に渡すのではなく、ByteBuffer オブジェクトを渡すことです。バッファ内に値を設定するには、バッファ オブジェクトのメソッドを呼び出す必要があります。これは、C 言語から、オブジェクトのクラスをクエリし、クラスに適切なメソッドをクエリしてから、メソッドを呼び出すことを意味します。

たとえば、ByteBuffer オブジェクトで put(int index, byte b) メソッドを呼び出すのと同じことをしたい場合は、C コードで次のようにする必要があります。

jclass cls = (*env)->GetObjectClass(env, objID);
jmethodId mid = (*env)->GetMethodID(env, cls, "put","(IB)V");
if(mid == 0) return;
(*env)->CallVoidMethod(env, objID, mid, 0, 'A');
于 2012-09-30T20:20:19.183 に答える