【发布时间】:2015-04-08 22:31:40
【问题描述】:
我正在从事一个图像处理项目。我有一个SurfaceView,我想从 jni 端显示“图像”。
我按照这个blog,NDK 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