android:如何通过更新表面缓冲区从ndk更新表面视图?
我在做一个图像处理项目。我有一个android:如何通过更新表面缓冲区从ndk更新表面视图?,android,c,android-ndk,java-native-interface,surfaceview,Android,C,Android Ndk,Java Native Interface,Surfaceview,我在做一个图像处理项目。我有一个SurfaceView,我想在这里显示jni端的“图像” 我遵循这条指令,使用NDK anativewindowapi来获取缓冲区的指针,并从C端进行更新 我得到了要运行的代码,但我的SurfaceView没有更新(没有显示任何图像…)。此外,更新缓冲区时不会调用回调surfaceChanged 以下是我正在做的: JNI端: } java端: 谢谢你的时间和帮助 导致空白表面视图的最常见问题之一是为视图设置背景。视图内容是一个透明的“孔”,仅用于布局。曲面内容位
SurfaceView
,我想在这里显示jni端的“图像”
我遵循这条指令,使用NDK anativewindowapi来获取缓冲区的指针,并从C端进行更新
我得到了要运行的代码,但我的SurfaceView没有更新(没有显示任何图像…)。此外,更新缓冲区时不会调用回调
surfaceChanged
以下是我正在做的:
JNI端:
}
java端:
谢谢你的时间和帮助 导致空白表面视图的最常见问题之一是为视图设置背景。视图内容是一个透明的“孔”,仅用于布局。曲面内容位于视图图层下方的单独图层上,因此只有在视图保持透明时,曲面内容才可见
通常应禁用视图背景,并且在视图上不绘制任何内容,除非您想要某种“遮罩”效果(如圆角)。
surfaceChanged()
在曲面特征更改时调用,而不是在曲面内容更改时调用。您是否能够使用Java代码中的画布在曲面上绘制?有多种方法可以阻止SurfaceView曲面可见(如在视图上设置背景),最好将其排除在外。我正在为SurfaceView设置背景,只是为了查看它是否已创建和绘制。我将尝试删除背景。谢谢你成功了!!!谢谢这是背景:)如果你不介意的话,我建议你在回答中写下你的评论,它可以帮助其他人。。。
/*
* Class: com_example_myLib
* Method: renderImage
* Signature: (JI)V
*/
JNIEXPORT void JNICALL com_example_myLib_renderImage
(JNIEnv *mJNIEnv, jobject mjobject, jobject javaSurface) {
#ifdef DEBUG_I
LOGI("renderImage attempt !");
#endif
// load an ipl image. code tested and works well with ImageView.
IplImage *iplimage = loadMyIplImage();
int iplImageWidth = iplimage->width;
int iplImageHeitgh = iplimage->height;
char * javalBmpPointer = malloc(iplimage->width * iplimage->height * 4);
int _javaBmpRowBytes = iplimage->width * 4;
// code tested and works well with ImageView.
copyIplImageToARGBPointer(iplimage, javalBmpPointer, _javaBmpRowBytes,
iplimage->width, iplimage->height);
#ifdef DEBUG_I
LOGI("ANativeWindow_fromSurface");
#endif
ANativeWindow* window = ANativeWindow_fromSurface(env, javaSurface);
#ifdef DEBUG_I
LOGI("Got window %p", window);
#endif
if(window != 0 ){
ANativeWindow_Buffer buffer;
if (ANativeWindow_lock(window, &buffer, NULL) == 0) {
#ifdef DEBUG_I
LOGI("GANativeWindow_lock %p", buffer);
#endif
memcpy(buffer.bits, javalBmpPointer, iplimage->width* iplimage->height* 4); // ARGB_8888
ANativeWindow_unlockAndPost(window);
}
ANativeWindow_release(window);
}
// every time that I want to reload the image:
renderImage(mySurfaceView.getHolder().getSurface());