Convert munmap operation to JNI

This commit is contained in:
tarsin committed 2023-02-02 20:15:05 +08:00
1 parent f5bd097584
commit 6efe8922b3
2 files changed
+12 -9

No files matched your search

-7
View File
@@ -23,10 +23,3 @@ Java_com_hippo_Native_getFd(JNIEnv *env, jclass clazz, jobject fileDescriptor) {
return fd;
}
JNIEXPORT void JNICALL
Java_com_hippo_Native_unmapDirectByteBuffer(JNIEnv *env, jclass clazz, jobject buffer) {
void *addr = (*env)->GetDirectBufferAddress(env, buffer);
size_t size = (*env)->GetDirectBufferCapacity(env, buffer);
if (munmap(addr, size)) LOGE("munmap addr:%p, size%zu failed!", addr, size);
}
@@ -15,13 +15,23 @@ import platform.posix.PROT_READ
import platform.posix.PROT_WRITE
import platform.posix.errno
import platform.posix.mmap
import platform.posix.strerror
import platform.posix.munmap
@OptIn(UnsafeNumber::class)
@Suppress("UNUSED_PARAMETER")
@CName("Java_com_hippo_Native_mapFd")
fun mapFd(env: CPointer<JNIEnvVar>, clazz: jclass, fd: jint, capability: jlong): jobject {
val result = mmap(null, capability.tosize_t(), PROT_READ or PROT_WRITE, MAP_PRIVATE, fd, 0)
result ?: Warn("mmap call with fd:${fd} capability:${capability} failed!, error:${strerror(errno)}")
result ?: Warn("mmap call with fd:${fd} capability:${capability} failed!, errno:${errno}")
return result?.let { env.newDirectByteBuffer(result, capability) } ?: interpretCPointer(nativeNullPtr)!!
}
@Suppress("UNUSED_PARAMETER")
@OptIn(UnsafeNumber::class)
@CName("Java_com_hippo_Native_unmapDirectByteBuffer")
fun unmapFd(env: CPointer<JNIEnvVar>, clazz: jclass, buffer: jobject) {
val addr = env.getDirectBufferAddress(buffer)
val size = env.getDirectBufferCapacity(buffer)
val result = munmap(addr, size.tosize_t())
if (result != 0) Warn("mmap call with addr:${addr} size:${size} failed!, errno:${errno}")
}