当前位置:操作系统 > 安卓/Android >>

android之JNI端获取并操作Su易做图ce

前一段时间研究android, 在jni端操作su易做图ce遇到麻烦,主要是C++基础太差,Su易做图ce.cpp读了n遍,也仿照网上查到的资料,试图从Java端传递Su易做图ce,然后jni端进行操作。却总是遇到各种各样的异常,前前后后卡住了7天,最后终于解决了,放出这个方法,总会对某些朋友有帮助。

  其实不是原创的,只是,网上有1000篇帖子,有999篇都讲的同一种方法,但在我这里却偏偏成功不了。终于那天偶然看到一篇e文的帖子,是有人分析了 havlenapetr 的libjnivideo.so, 然后放出了ta使用的方法,原来想当简单:


static android::sp<android::Su易做图ce> native_su易做图ce;

static android::Su易做图ce* getNativeSu易做图ce(JNIEnv* env, jobject jsu易做图ce, jint version)
{
    jclass clazz = env->FindClass("android/view/Su易做图ce");
    jfieldID field_su易做图ce;
    if(version <=8)
    {
        field_su易做图ce = env->GetFieldID(clazz, "mSu易做图ce", "I");
    }
    else
        field_su易做图ce = env->GetFieldID(clazz, ANDROID_VIEW_SURFACE_JNI_ID, "I");

    if (field_su易做图ce == NULL)
    {
        return NULL;
    }
    return (android::Su易做图ce *) env->GetIntField(jsu易做图ce, field_su易做图ce);
}

int setSu易做图ce(JNIEnv *env, jobject jsu易做图ce, jint version)
{
    native_su易做图ce = getNativeSu易做图ce(env, jsu易做图ce, version);

    if(android::Su易做图ce::isValid(native_su易做图ce))
    {
        __android_log_print(ANDROID_LOG_INFO, "libjni", "native_su易做图ce is valid");
        return 1;
    }
    else
        __android_log_print(ANDROID_LOG_ERROR, "libjni", "native_su易做图ce is invalid");

    return 0;
}

  jsu易做图ce就是从Java端传递过来的,然后这里的 native_su易做图ce,就是我们想要的native su易做图ce了。为什么要 传递个version? 因为 android2.2以上的版本,android.view.Su易做图ce里面没有“mSu易做图ce"了,而是用了一个常量 ANDROID_VIEW_SURFACE_JNI_ID, 区分下版本就行了。

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

static android::Su易做图ce::Su易做图ceInfo info;
static android::Region dirtyRegion;

做下初始化:

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

然后

  native_su易做图ce->lock(&info, &dirtyRegion, true);

  memcpy(info.bits, buf, bufSize);

  native_su易做图ce->unlockAndPost();

就显示出来了。

作者:ljplum

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,