1.比如是一个AsesetManager类
private native final void init();
对应的c语言:
static void android_content_AssetManager_init(JNIEnv* env,jobject jobject)
那么JNIEnv对象,是一个java虚拟机(JVM),通过它就能访问JVM中的各种对象。jobject是该函数的对象。
2.生成头文件
javah -d ~/Desktop -jni com.xxxx.Foo
其中-d是指定文件生成的位置,-jni要放在后面,表示生成jni文件。
3.c中调用java中的方法
①对于java对象的类
cls=env->GetObjectClass(jobject)
②获取函数的id
env->GetMethodId(cls,"method name","(Ljava/lang/String;)V")
最后一个参数表示的是java的参数和返回值,其中Ljava/lang/String;表示的是参数为String,V表示的返回值为void.
如果是object,那么就对应 'L'+'packageName'+';'
这个是可以通过javap工具进行获取,p的意思是(params)参数
javap -s com/xxxx/xxxx
-s表示的签名(signature)
③开始进行调用函数
env->CallXXXMethod(jobject,mid,ret)
其中第三个参数ret保存的是返回值的变量。
4.c调用java中的属性
①cls=env->GetObjectClass(jobject)
②jfieldId fid=env->GetFiledId(cls,"filedname","I")
第三个参数是变量的类型
③value=env->GetXXXField(env,jobject,fid)