Здравствуйте, я создал класс Android, используя C, который выполняет некоторые операции. Среди этих процедур я хочу использовать это: (только для тестирования с Delphi)Delphi использует процедуру от обертки Jni Android
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);
}
конечно мой testlib.so построен и скомпилированный (NDK-сборки с использованием Cygwin) и развернутого с моим проектом Delphi.
И в моем клиенте 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;
Но здесь я получаю исключение, и приложение падает.
Возможно, кто-нибудь поможет мне исправить это?
Так что спасибо.
Update: можно устранить 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);
такой же ошибка.
'ADataOut' в' TestMyProcedure() 'не инициализирован, но' Java_Test_Project_Decode() 'пытается получить к нему доступ и написать ему. 'Java_Test_Project_Decode()' требует, чтобы 'ADataIn' и' ADataOut' были указателями на допустимые ** байт-массивы Java ** размером не менее 2 элементов. –
@RemyLebeau, я могу устранить «ADateOut» как в процедурах Delphi, так и в Java, но все равно получаю одинаковые исключения и ошибки. хотя 'ADataIn' не пуст и не инициализирован – randydom
Измените свой вопрос, чтобы показать обновленный код. –