1 static android::sp<android::Surface> native_surface;
2
3 static android::Surface* getNativeSurface(JNIEnv* env, jobject jsurface, jint version)
4 {
5 jclass clazz = env->FindClass("android/view/Surface");
6 jfieldID field_surface;
7 if(version <=8)
8 {
9 field_surface = env->GetFieldID(clazz, "mSurface", "I");
10 }
11 else
12 field_surface = env->GetFieldID(clazz, ANDROID_VIEW_SURFACE_JNI_ID, "I");
13
14 if (field_surface == NULL)
15 {
16 return NULL;
17 }
18 return (android::Surface *) env->GetIntField(jsurface, field_surface);
19 }
20
21 int setSurface(JNIEnv *env, jobject jsurface, jint version)
22 {
23 native_surface = getNativeSurface(env, jsurface, version);
24
25 if(android::Surface::isValid(native_surface))
26 {
27 __android_log_print(ANDROID_LOG_INFO, "libjni", "native_surface is valid");
28 return 1;
29 }
30 else
31 __android_log_print(ANDROID_LOG_ERROR, "libjni", "native_surface is invalid");
32
33 return 0;
34 }



  jsurface就是从Java端传递过来的,然后这里的 native_surface,就是我们想要的native surface了。为什么要 传递个version? 因为 android2.2以上的版本,android.view.Surface里面没有“mSurface"了,而是用了一个常量 ANDROID_VIEW_SURFACE_JNI_ID, 区分下版本就行了。

  然后又发现jni端操作surface也是相当简单,至少显示图像之类的很容易:

1 static android::Surface::SurfaceInfo info;
2 static android::Region dirtyRegion;



做下初始化:

  

dirtyRegion.set(android::Rect(0x3FFF, 0x3FFF));

然后

  

1 native_surface->lock(&info, &dirtyRegion, true);
2
3   memcpy(info.bits, buf, bufSize);
4
5   native_surface->unlockAndPost();

      

就显示出来了。

更多相关文章

  1. Android(安卓)Listview控件一些重要的属性
  2. android中的(singleLine)单行显示 none start middle
  3. android 笔记 --- ImageView的属性android:scaleType
  4. ArcGis Android(安卓)10.2.6更新文档翻译
  5. Android版本和API Level
  6. android关机充电流程、充电画面显示
  7. Android基础UI之ListView
  8. android 开发工具
  9. Android(安卓)layout布局属性、标签属性总结大全

随机推荐

  1. Android - 字符串的加密和解密
  2. android之widget详解
  3. [置顶] 【Android Notes】置顶索引
  4. Android TextView自动换行
  5. Android(安卓)获取amr音频文件时长
  6. Android(安卓)sdk manager 显示 “Done l
  7. Android EventLog各种标签含义
  8. android Dialog的确定按钮点击后不取消对
  9. 3种Android隐藏顶部状态栏及标题栏的方法
  10. 如何修改android开机启动默认横竖屏