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());