以下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());
}
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());
}
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++可以取实现与硬件交互功能,具体自己仔细看下应该可以明白。
context->incStrong(thiz);
camera->setListener(context); env->SetIntField(thiz, fields.context, (int)context.get());
//创建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