gpt4 book ai didi

Android NDK JNI数组引用表溢出

转载 作者:行者123 更新时间:2023-11-29 21:33:14 25 4
gpt4 key购买 nike

我有两个函数,但出现 ReferenceTable 溢出。消耗的数组条目的摘要是:

     1 of byte[] (3 elements)
446 of byte[] (75 elements) (2 unique instances)
576 of byte[] (147 elements) (2 unique instances)
1 of int[] (25 elements)

我真的去查了代码没有发现什么错误,但是没有发现。我在获取数组后释放它们。唯一就是这些函数被调用了上千次,会不会是这个原因?

这是我所有的原生代码:

调用一次:

JNIEXPORT void JNICALL Java_ar_com_teasoft_Image_nativeUnlock(
JNIEnv *env, jclass clazz, jobject bitmap) {
AndroidBitmap_unlockPixels(env, bitmap);
}

调用一次:

JNIEXPORT jlong JNICALL Java_ar_com_teasoft_Image_nativeLock(
JNIEnv *env, jclass clazz, jobject bitmap) {
int ret;
AndroidBitmapInfo info;
if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return 0;
}
if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
LOGE("Bitmap format is not RGBA_8888!");
return 0;
}
void* bitmapPixels;
if ((ret = AndroidBitmap_lockPixels(env, bitmap, &bitmapPixels)) < 0) {
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
return 0;
}
return (jlong) bitmapPixels;

}

多次调用:

JNIEXPORT void JNICALL Java_ar_com_teasoft_Image_nativeCopyPixels(
JNIEnv *env, jclass clazz, jlong dataRef, jintArray sourceIndexes,
jintArray targetIndexes, jint count) {
argb* sourcePixels;
argb* targetPixels;
jint *sourceArray = env->GetIntArrayElements(sourceIndexes, NULL);
jint *targetArray = env->GetIntArrayElements(targetIndexes, NULL);
for (int i = 0; i < count; i++) {
sourcePixels = (argb*)((char*) dataRef + sourceArray[i] * 4);
targetPixels = (argb*)((char*) dataRef + targetArray[i] * 4);
(*targetPixels) = (*sourcePixels);
}
env->ReleaseIntArrayElements(sourceIndexes, sourceArray, JNI_ABORT);
env->ReleaseIntArrayElements(targetIndexes, targetArray, JNI_ABORT);

}

多次调用:

JNIEXPORT void JNICALL  Java_ar_com_teasoft_Image_nativeGetRGB(
JNIEnv *env, jclass clazz, jlong dataRef, jintArray indexes,
jbyteArray destRgb) {
jint *array = env->GetIntArrayElements(indexes, NULL);
jbyte *dstarray = env->GetByteArrayElements(destRgb, NULL);
int size = env->GetArrayLength(indexes);
char* sourcePixels;
int dstCount = 0;
for (int i = 0; i < size; i++) {
sourcePixels = (char*) dataRef + array[i] * 4;
dstarray[dstCount++] = (*(sourcePixels + 1));
dstarray[dstCount++] = (*(sourcePixels + 2));
dstarray[dstCount++] = (*(sourcePixels + 3));
}
env->ReleaseIntArrayElements(indexes, array, JNI_ABORT);
env->ReleaseByteArrayElements(destRgb, dstarray, JNI_COMMIT);
}

根据总结,好像是没有发布的,是byte[]的,所以应该是nativeGetRGB函数中的那个。但是我找不到错误的地方。

请帮忙!问候,胡安·伊格纳西奥

最佳答案

Java_ar_com_teasoft_Image_nativeGetRGB():

据我所知,您需要通过传递 0 而不是 JNI_COMMIT 来提交 释放任何临时数组副本ReleaseByteArrayElements()Get*ArrayElements() 的第二个参数是一个指向 bool 值的指针,如果返回的数组是一个副本,而不是固定内存,它将被设置为 true。

Java_ar_com_teasoft_Image_nativeCopyPixels():

您可能还想传递 0 而不是 JNI_ABORT,它会丢弃所有内容,在此处:

env->ReleaseIntArrayElements(targetIndexes, targetArray, JNI_ABORT);

数组的棘手之处在于, Release模式仅适用于复制的数组,因为直接修改固定内存。无法强制执行阵列复制或固定。

关于Android NDK JNI数组引用表溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18938761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com