こんにちは私はいくつかの操作を行うCを使ってAndroidクラスを作成しました。もちろん私のtestlib.soが構築され、(Cygwinを使用してNDKビルド)をコンパイルし、私のDelphiのプロジェクトを展開されているのDelphiはAndroid Jniラッパーからプロシージャを使用します
JNIEXPORT void Java_Test_Project_Decode(JNIEnv* env, jclass clazz,jbyteArray dataIn, jbyteArray dataOut)
{
jsize len = (*env)->GetArrayLength(env, dataIn);
LOGV("JNI call Decode test dataIn Size = %d",len);
jbyte *pByteIn = (*env)->GetByteArrayElements(env, dataIn, 0);
jbyte *pByteOut = (*env)->GetByteArrayElements(env, dataOut, 0);
*pDataOut = *pDataIn; pDataIn++; pDataOut++;
*pDataOut = *pDataIn; pDataIn++; pDataOut++;
*pDataOut = *pDataIn; pDataIn++; pDataOut++;
// some routines
(*env)->ReleaseByteArrayElements(env, dataOut, pByteOut, 0);
(*env)->ReleaseByteArrayElements(env, dataIn, pByteIn, 0);
}
(Delphiで単なるテスト用):これらの手順の中で は、私はこの1つを使用します。
そして、私のDelphi FireMonkeyのクライアントで、私はこのように、この手順を使用します。
もちろんのJava_Test_Project_Decode:procedure(PEnv: PJNIEnv; Obj:JObject;dataIn:Pointer;DataOut:Pointer); cdecl;
私は自分のライブラリをロードした後:
Procedure LoadMyLib();
begin
FMyLib := LoadLibrary(PChar(LibFolder + LibTest));
if FMyLib = 0 then
begin
Exit;
end
else
begin
Java_Test_Project_Decode:=GetProcAddress(FMyLib,'Java_Test_Project_Decode');
if not assigned (Java_Test_Project_Decode) then
begin
Exit; // Java_Test_Project_Decode procedure not loaded
end else
begin
// OK Java_Test_Project_Decode procedure loaded
end;
end;
end;
その後、私は手順を使用します。
Procedure TestMyProcedure (ADataIn: pointer; ASize: integer);
var
ADataOut:Pointer;
begin
// ADataIn pointer is not empty
Java_Test_Project_Decode(PEnv,Obj,ADataIn,ADataOut);
end;
ここでは例外が発生し、アプリがクラッシュします。
誰でもこの問題を解決する手助けができますか?
ありがとうございました。
更新: 次のように私はADataOut
を排除することができます
JNIEXPORT void Java_Test_Project_Decode(JNIEnv* env, jclass clazz,jbyteArray dataIn)
{
jsize len = (*env)->GetArrayLength(env, dataIn);
LOGV("JNI call Decode test dataIn Size = %d",len);
jbyte *pByteIn = (*env)->GetByteArrayElements(env, dataIn, 0);
// some routines
(*env)->ReleaseByteArrayElements(env, dataIn, pByteIn, 0);
}
と私のDelphiの宣言:
Java_Test_Project_Decode:procedure(PEnv: PJNIEnv; Obj:JObject;dataIn:Pointer); cdecl;
Procedure TestMyProcedure (ADataIn: pointer; ASize: integer);
begin
// ADataIn pointer is not empty
Java_Test_Project_Decode(PEnv,Obj,ADataIn);
end;
しかし、常に同じ例外やエラーで、私もちょうどしようとしたが入手する
jsize len = (*env)->GetArrayLength(env, dataIn);
LOGV("JNI call Decode test dataIn Size = %d",len);
同じエラー。
'TestMyProcedure()'の 'ADataOut'は初期化されていませんが、' Java_Test_Project_Decode() 'は初期化されていません。 'Java_Test_Project_Decode()'は、サイズが少なくとも2要素の有効な** Java **バイト配列へのポインタになるために、 'ADataIn'と' ADataOut'を必要とします。 –
@RemyLebeau、私は、DelphiとJavaの両方のプロシージャで 'ADateOut'を削除できますが、同じ例外とエラーが発生しています。 'ADataIn'は空ではありません。 – randydom
あなたの質問を編集して、更新されたコードを表示してください。 –