1  native C 函数和JAVA函数的参数为什么不太一样?
 比如 mediarecorder函数:
    private static native final void native_init();
    private native final void native_setup(Object mediarecorder_this) throws IllegalStateException;
相对应的native C函数
      {"native_init",          "()V",                             (void *)android_media_MediaRecorder_native_init},
    {"native_setup",         "(Ljava/lang/Object;)V",           (void *)android_media_MediaRecorder_native_setup},
定义:
  static void   android_media_MediaRecorder_native_init(JNIEnv *env);
  android_media_MediaRecorder_native_setup(JNIEnv *env, jobject thiz, jobject weak_this); 看init函数JAVA层传下来是没有参数的,而JNI有1个参数JNIEnv *env, 而setup 函数传下来是1个参数,为什么传下来的却是3个参数,jobject thiz是什么东东? 
   发现很多函数传下来都会多出2个参数,有些也只是多出1个参数
问题 2
   比如mediarecorder java class,java会new一个mediarecorder class ,然后将这个class传到native C,  native C 会getobject, 底层也有一个mediacorder, 这个C的mediarecorder 和 java的mediarecorder 除了实现的函数要一致外, 定义等是否要指针一一对应? 不然不是有问题了?谢谢

解决方案 »

  1.   

    JNIEnv是jni环境,用来调jni的方法。thiz就是this对象。static方法没有this对象所以没这个参数。
      

  2.   

    对jni不了解的话还是先找点简单的例子看看比较好。
    static的我没用过,对非静态函数,假如我们的包名是:com.android.test,
    java函数为:int add(int a, int b);
    对应的c函数就是:jint Java_com_android_test_add(JNIEnv *env, jobject obj, jint a, jint b);
    env是JNIEnv的实例(参见jni.h),用来调用jni方法,obj为java中对象的引用,也就是"this"指针。
    有兴趣可以发你个《JNI完全手册》,感觉写的不错。
      

  3.   

    非常感谢你们那么JAVA的类和传下来在C中定义的类,这两个类不需要任何关系么? 谢谢
      

  4.   

    比如mediarecorder吧:其中setCamera函数中:
    JAVA定义为:    public native void setCamera(Camera c); 这个Camera 是JAVA中的Camera类 JNI函数:
    static void android_media_MediaRecorder_setCamera(JNIEnv* env, jobject thiz, jobject camera)
    {
        // we should not pass a null camera to get_native_camera() call.
        if (camera == NULL) {
            jniThrowNullPointerException(env, "camera object is a NULL pointer");
            return;
        }
        sp<Camera> c = get_native_camera(env, camera, NULL);
        sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
        process_media_recorder_call(env, mr->setCamera(c->remote(), c->getRecordingProxy()),
                "java/lang/RuntimeException", "setCamera failed.");
    }这个函数中的camera类和C中的Camera.cpp传递怎么传呢?还有这个函数中调用的getMediaRecorder()
    定义为:
    static sp<MediaRecorder> getMediaRecorder(JNIEnv* env, jobject thiz)
    {
        Mutex::Autolock l(sLock);
        MediaRecorder* const p = (MediaRecorder*)env->GetIntField(thiz, fields.context);
        return sp<MediaRecorder>(p);
    }
    GetIntField(thiz, fields.context);这个函数得到的MediaRecorder 不是JAVA的类么? 这样直接转换过来怎么就可以呢? 谢谢