【问题标题】:android: how to Update a SurfaceView from the ndk by updating the Surface buffer?android:如何通过更新 Surface 缓冲区从 ndk 更新 SurfaceView?
【发布时间】:2015-04-08 22:31:40
【问题描述】:

我正在从事一个图像处理项目。我有一个SurfaceView,我想从 jni 端显示“图像”。

我按照这个blogNDK ANativeWindow API指令来获取缓冲区的指针并从C端更新。

我得到了运行代码,但我的 SurfaceView 没有更新(没有显示任何图像......)。更新缓冲区时也不会调用回调surfaceChanged

这是我正在做的事情:

JNI 端:

/*
  * 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);

 }

}

java 端:

// every time that I want to reload the image:
   renderImage(mySurfaceView.getHolder().getSurface());

感谢您的时间和帮助!

【问题讨论】:

  • surfaceChanged() 在表面特征改变时调用,而不是在表面内容改变时调用。您是否能够使用 Java 代码中的 Canvas 在表面上绘图?有多种因素会阻止 SurfaceView 表面可见(例如在 View 上设置背景),最好将它们排除在外。
  • 我正在为surfaceview设置一个背景,只是为了看看它已经被创建和绘制了。我会尝试删除背景。谢谢
  • 成功了!!!谢谢 !!!这是背景:) 如果您不介意,我建议您在答案中写下您的评论,它可以帮助其他人...

标签: android c android-ndk java-native-interface surfaceview


【解决方案1】:

导致空白 SurfaceView 的最常见问题之一是为 View 设置背景。视图内容旨在成为一个透明的“洞”,仅用于布局。 Surface 内容位于 View 层下方的单独层上,因此它们仅在 View 保持透明时可见。

通常应该禁用视图背景,并且在视图上不绘制任何内容,除非您想要某种“蒙版”效果(如圆角)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多