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 除了实现的函数要一致外, 定义等是否要指针一一对应? 不然不是有问题了?谢谢
比如 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 除了实现的函数要一致外, 定义等是否要指针一一对应? 不然不是有问题了?谢谢
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完全手册》,感觉写的不错。
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的类么? 这样直接转换过来怎么就可以呢? 谢谢