以下code是framework/base/core/jni/android_hardware_Camera.cpp,求详细分析。
static void android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz,
    jobject weak_this, jint cameraId)
{
    sp<Camera> camera = Camera::connect(cameraId);    if (camera == NULL) {
        jniThrowRuntimeException(env, "Fail to connect to camera service");
        return;
    }    // make sure camera hardware is alive
    if (camera->getStatus() != NO_ERROR) {
        jniThrowRuntimeException(env, "Camera initialization failed");
        return;
    }    jclass clazz = env->GetObjectClass(thiz);
    if (clazz == NULL) {
        jniThrowRuntimeException(env, "Can't find android/hardware/Camera");
        return;
    }    // We use a weak reference so the Camera object can be garbage collected.
    // The reference is only used as a proxy for callbacks.
    sp<JNICameraContext> context = new JNICameraContext(env, weak_this, clazz, camera);
    context->incStrong(thiz);
    camera->setListener(context);    // save context in opaque field
    env->SetIntField(thiz, fields.context, (int)context.get());
}

解决方案 »

  1.   

    static void android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz,
        jobject weak_this, jint cameraId)
    该方法是jni代码,上面这个是android_hardware_Camera在java文件中要对应的包名和类名(如果要使用该so库,就在要com.android.hardware下新建一个Camera类。),后面的setup是该类下的一个接口。
    只要在Camera.java中声明public static native void setup(object weak_this, int cameraId),在java工程下就可以使用了。
    方法里面的实现使用C/C++可以取实现与硬件交互功能,具体自己仔细看下应该可以明白。
      

  2.   

    谢谢你的回复,我想知道以下的代码是干吗的?我一句都看不懂。求指点    sp<JNICameraContext> context = new JNICameraContext(env,       weak_this, clazz, camera);
        context->incStrong(thiz);
        camera->setListener(context);    env->SetIntField(thiz, fields.context, (int)context.get());
      

  3.   

    sp<Camera> camera = Camera::connect(cameraId);
    //创建camera service的对象(代理
    sp<JNICameraContext> context = new JNICameraContext(env,weak_this, clazz, camera);
    //创建JNICameraContext对象,并把service对象保存在其中
        context->incStrong(thiz);
        camera->setListener(context);
    //最后再把回调接口设置到camera service中。因为JNICameraContext实现了回调接口CameraListener,所以也就是把JNICameraContext设置到camera service中。http://photo.blog.sina.com.cn/list/blogpic.php?pid=6b653d11gaa8934325cb2&bid=6b653d110100xa2q&uid=1801796881