【发布时间】:2016-09-19 14:08:02
【问题描述】:
您好,我使用 C 创建了一个 Android 类,它执行一些操作。 在这些程序中,我想使用这个:(仅用于 Delphi 测试)
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-build using 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;
但是在这里我得到一个异常并且应用程序崩溃了。
谁能帮我解决这个问题?
谢谢。
更新:
我可以按如下方式消除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;
但总是有同样的异常和错误,我什至试图得到 p>
jsize len = (*env)->GetArrayLength(env, dataIn);
LOGV("JNI call Decode test dataIn Size = %d",len);
同样的错误。
【问题讨论】:
-
ADataOutinTestMyProcedure()未初始化,但Java_Test_Project_Decode()正在尝试访问和写入它。Java_Test_Project_Decode()要求ADataIn和ADataOut是指向有效 Java 字节数组的指针,该数组的大小至少为 2 个元素。 -
@RemyLebeau,我可以在 Delphi 和 Java 程序中消除
ADateOut,但仍然得到相同的异常和错误。虽然ADataIn不是空的并且已初始化 -
请编辑您的问题以显示更新后的代码。
-
@RemyLebeau 我更新了我的代码只是为了获取 DataIn 大小并记录它,但总是出现相同的错误和异常
-
在 Android 上,Delphi 有一个
JObject接口,它与 JNI 的JObject类型是分开的。确保在函数声明中使用 JNI 类型。
标签: java android delphi firemonkey-fm3