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版本问题 版本冲突
  2. Android版本和API Level
  3. ADT版本更新失败,降级
  4. Android Choreographer 初始化
  5. Android Environment 常量含义
  6. Android对应版本号
  7. android API版本对应的系统版本及Android获取手机和系统版本等信
  8. Android修改APP版本号
  9. cocos2dx打包Android出现“未指定Android目标平台版本”问题

随机推荐

  1. Android(安卓)时间日期选择器
  2. Android(安卓)-- 编辑框更改样式
  3. android 一个activity跳转另一个activity
  4. 85 Android(安卓)ListView 和 ScrollView
  5. Android获取移动设备IP地址
  6. Android---fragment动态切换简单使用
  7. android常用系统bar高度
  8. android recycleview 中禁止多点触发
  9. Android(安卓)浮动button 自动靠边 自定
  10. android studio自动提示文本框