因此,我在平板电脑上对JNI功能进行了基准测试(平均超过3x5000次调用),每个调用花费了:
SetObjectField 0.35 milliseconds
NewStringUTF 0.03 milliseconds
GetObjectField 0.003 milliseconds
SetBooleanField 0.002 milliseconds
SetObjectArrayElement 0.002 milliseconds
因此,SetBooleanField,SetObjectArrayElement和GetObjectField相当快; NewStringUTF必须很慢,因为它正在分配新的内存。但是SetObjectField可能需要那么长时间呢?不仅仅是在已知位置写指针吗?它到处都慢吗,还是只在旧的Android 4.4平板电脑上慢?启用CheckJNI(“延迟启用CheckJNI”),这会改变情况吗?
Pascal中的基准代码:
for i := 1 to 3 do begin
starttime := now;
for k := 1 to 5000 do
env^^.SetObjectField(env, jbook, bookFields.accountL, jacc);
log('TESTING TIME: ' + inttostr(round( (now - starttime)*MSecsPerDay)));
end;
或
javaarray := env^^.NewObjectArray(env, 5001, bookClass, nil);
for i := 1 to 3 do begin
starttime := now;
for k := 1 to 5000 do
env^^.SetObjectArrayElement(env, javaarray, k, jbook);
log('TESTING TIME: ' + inttostr(round( (now - starttime)*MSecsPerDay)));
end;
jbook
,jacc
,bookClass
,bookFields.accountL
用我应用程序中的对象/类/字段初始化。而且它们不是nil
/ null(nil SetObjectField很快)。我手动进行平均。