我有一个简单的jni函数,用于将数据从文件读取到
byte[]
从C代码
UnixUtil.unsafeReadToByteArray
具体实施如下:
JNIEXPORT jlong JNICALL Java_net_xxxxxxx_UnixUtil_unsafeReadToByteArray
(JNIEnv *e, jclass jc, jint fd, jbyteArray array, jlong offset, jlong count){
signed char *array_native_ptr = (*e) -> GetByteArrayElements(e, array, NULL);
ssize_t bytes_read = read(fd, array_native_ptr + offset, (size_t) count);
(*e) -> ReleaseByteArrayElements(e, array, array_native_ptr, 0);
return bytes_read;
}
分析运行该函数的Java应用程序显示出一些不明确的结果。上面是:
最热门的一件事是按地址进行指令
0x18eb1f
它来自
libc-2.27.so
. 我想知道是什么,但gdb不知道
(gdb) disas 0x18eb1f
No function contains specified address
用libc替换我找到的地址
18eb0b: 72 0f jb 18eb1c <__nss_group_lookup@GLIBC_2.2.5+0x24ddc>
[...]
18eb1c: 48 89 d1 mov %rdx,%rcx
18eb1f: f3 a4 rep movsb %ds:(%rsi),%es:(%rdi)
看起来它是
__nss_group_lookup
虽然
_ nss_组查找
似乎不包含地址:
(gdb) disas __nss_group_lookup
Dump of assembler code for function __nss_passwd_lookup:
0x0000000000169d40 <+0>: mov rax,QWORD PTR [rip+0x281121] # 0x3eae68
0x0000000000169d47 <+7>: mov DWORD PTR fs:[rax],0x26
0x0000000000169d4e <+14>: mov eax,0xffffffff
0x0000000000169d53 <+19>: ret
End of assembler dump. making the things more unclear then it was before.
使事情比以前更不清楚。
问题:
你能告诉我为什么这个指令属于
_ nss_组查找
是最热门的
jni_GetByteArrayElements
/
jni_ReleaseByteArrayElements
以及它到底是什么。
我的期望是
JNI_Getbytearrayellements公司
/
按顺序释放
复制
字节[]
从Java堆到C堆
memcpy
会是最热的。