通过JNI在本地C代码中实现Surface显示 最好能提供一个简单的示例. . 谢谢先 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 求jni 实现 Surface 显示例子 surface是android私有的接口,不建议使用,不保证一直能用。android 2.2 以前的, 接口变化不大, 2.2 之后的, 变化很大,不通用了。至于如何使用, 看源代码: android_view_surface.cpp弄一个surfaceView和一个surfaceHolder,通过JNI在native端获取这个surface后,就可以lock它,然后在上面画图,画完后unlockandpost就可以了。2.2之后,google开放了个bitmap的接口,可以在native端画图了,可以看ndk的例子:bitmap-plasma 你好 ! 目前我就卡在 lock它,然后在上面画图 这步了. 请问你有没有例子呢 int lock_surface(unsigned char **ppbuf, int *width, int *height, int *bpp){ unsigned short *surfaceBuffer; Surface::SurfaceInfo info; Region dirtyRegion; // invalid the whole surface dirtyRegion.set(Rect(0x3FFF, 0x3FFF)); if(g_surface == NULL){ LOGD("Error! surface not initialized!\n"); return -1; } status_t err = g_surface->lock(&info, &dirtyRegion); if (err < 0) { return -1; } *ppbuf = (unsigned char *)info.bits; *width = info.w; *height = info.h; switch(info.format){ case PIXEL_FORMAT_RGBA_8888: case PIXEL_FORMAT_RGBX_8888: case PIXEL_FORMAT_BGRA_8888: *bpp = 4; break; case PIXEL_FORMAT_RGB_888: *bpp = 3; break; case PIXEL_FORMAT_RGB_565: case PIXEL_FORMAT_RGBA_5551: case PIXEL_FORMAT_RGBA_4444: *bpp = 2; break; default: return -1; } return 0;}int unlock_and_post_surface(void){ if(g_surface == NULL){ LOGD("Error! surface not initialized!\n"); return -1; } return g_surface->unlockAndPost();}调用的地方:if(lock_surface(&graphic_buf, &output_width, &output_height, &bpp) < 0){ LOGE("ERROR! can not lock canvas"); continue;}yuv420_2_rgb565(yuv_location, graphic_buf, output_width, output_height, output_width<<1);unlock_and_post_surface();怎么获取surfaceView的native surface,从android_view_surface.cpp中剥出来就可以了。 非常感谢 .这些代码在NDK 环境能编译通过吗 ? 是不是需要源码环境 ? NDK上, 要把framework下合system下的一些头文件拷过去, 还有几个链接的库拷过去就可以了。如果不想这么麻烦,就在源码上编译 麻烦你方便的时候给出份编译时需要的文件列表.谢谢先 我对android 源码、 c | c + 都不是很熟 你好. 请问一下. 我下载的android 源代码怎么样没有 framework 这个文件夹 ? 少打一个sframework的大部分头文件在frameworks\base\includesystem的头文件在system\core\include库就从out\target\product\generic\system\lib下拷就可以了。前提是你要先编译一下。 我下载的源码 . 为什么没有这些文件 ? android_view_Surface.cpp 都找不到 如果下载正确, 在frameworks\base\core\jni下面。如果这些都没有, 那就没下载成功。froyo下载下来后, 看下文件夹的大小,大概在2G左右。 现在下载成功了. 在虚似机 make 了一下午 . 卡住不动了 external/opencore/android/android_surface_output.hexternal/opencore/android/android_surface_output.cpp 这是opencore对surface的抽象,能满足你的要求。我曾据此写播放器的surface。 对,这个Opencore中的代码也很有价值:external/opencore/android/android_surface_output.hexternal/opencore/android/android_surface_output.cpp 不懂的地方太多了,学习NDK技术 2.2之后,google开放了个bitmap的接口,可以在native端画图了,可以看ndk的例子:bitmap-plasma它这个例子只是把bitmap的接口传到NDK层吧,在NDK层画完还是要返回JAVA层才能用这个bitmap对象吧!!! 请问怎么设置全局的onTouchEvent事件呢? 谁会用Android的Widget android 怎么解析epub啊? SurfaceView设置背景颜色遮挡问题 关于读取Android虚拟机多媒体文件的问题? 怎么把几个应用放在mainmenu的规定位置? android 怎么挂再mtd分区, google map +GPS 定位 Dialog可以设置为满屏显示吗? cocos2d-x中关于android编译的疑问 jni显示surface的问题 解释一行关于LayoutInflater的代码
android 2.2 以前的, 接口变化不大, 2.2 之后的, 变化很大,不通用了。至于如何使用, 看源代码: android_view_surface.cpp弄一个surfaceView和一个surfaceHolder,通过JNI在native端获取这个surface后,就可以lock它,然后在上面画图,画完后unlockandpost就可以了。2.2之后,google开放了个bitmap的接口,可以在native端画图了,可以看ndk的例子:bitmap-plasma
你好 ! 目前我就卡在 lock它,然后在上面画图 这步了. 请问你有没有例子呢
int lock_surface(unsigned char **ppbuf, int *width, int *height, int *bpp){
unsigned short *surfaceBuffer;
Surface::SurfaceInfo info;
Region dirtyRegion;
// invalid the whole surface
dirtyRegion.set(Rect(0x3FFF, 0x3FFF));
if(g_surface == NULL){
LOGD("Error! surface not initialized!\n");
return -1;
} status_t err = g_surface->lock(&info, &dirtyRegion);
if (err < 0) {
return -1;
} *ppbuf = (unsigned char *)info.bits;
*width = info.w;
*height = info.h; switch(info.format){
case PIXEL_FORMAT_RGBA_8888:
case PIXEL_FORMAT_RGBX_8888:
case PIXEL_FORMAT_BGRA_8888:
*bpp = 4;
break;
case PIXEL_FORMAT_RGB_888:
*bpp = 3;
break;
case PIXEL_FORMAT_RGB_565:
case PIXEL_FORMAT_RGBA_5551:
case PIXEL_FORMAT_RGBA_4444:
*bpp = 2;
break; default:
return -1;
} return 0;
}int unlock_and_post_surface(void){ if(g_surface == NULL){
LOGD("Error! surface not initialized!\n");
return -1;
}
return g_surface->unlockAndPost();
}
调用的地方:if(lock_surface(&graphic_buf, &output_width, &output_height, &bpp) < 0){
LOGE("ERROR! can not lock canvas");
continue;
}
yuv420_2_rgb565(yuv_location, graphic_buf,
output_width, output_height, output_width<<1);
unlock_and_post_surface();
怎么获取surfaceView的native surface,从android_view_surface.cpp中剥出来就可以了。
非常感谢 .这些代码在NDK 环境能编译通过吗 ? 是不是需要源码环境 ?
如果不想这么麻烦,就在源码上编译
麻烦你方便的时候给出份编译时需要的文件列表.谢谢先 我对android 源码、 c | c + 都不是很熟
你好. 请问一下. 我下载的android 源代码怎么样没有 framework 这个文件夹 ?
frameworks\base\include
system的头文件在
system\core\include库就从
out\target\product\generic\system\lib
下拷就可以了。前提是你要先编译一下。
下面。如果这些都没有, 那就没下载成功。froyo下载下来后, 看下文件夹的大小,大概在2G左右。
现在下载成功了. 在虚似机 make 了一下午 . 卡住不动了
external/opencore/android/android_surface_output.cpp
external/opencore/android/android_surface_output.h
external/opencore/android/android_surface_output.cpp
2.2之后,google开放了个bitmap的接口,可以在native端画图了,可以看ndk的例子:bitmap-plasma它这个例子只是把bitmap的接口传到NDK层吧,在NDK层画完还是要返回JAVA层才能用这个bitmap对象吧!!!