jni使用步骤:
1.定义好native接口。
2.使用javah工具,生成头文件。
3.根据头文件,创建c文件。
4.编写Android.mk文件。
5.通过cygwin,进入到该工程目录,通过ndk-buld命令,编译c文件,生成so库文件
6.即可完成调用
怎样在c中调用java?
也就是要在c代码中,new出java对象,然后再调用java对象中的方法即可。
要创建java对象,就要找到java类,相当于找到类的class文件,使用jni中的
FindClass去找到相应的类,然后再调用相应的方法。
简单代码:
//new 出java对象 jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");//注意:不能为“.” //获取类中的方法 jmethodID j_method = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");//最后一个参数是表示方法的签名 (*env)->CallVoidMethod(env,obj,j_method);//第二个参数表示调用的类对象
怎样获得java类方法中的签名:
通过javap -s com.devchina.ndk4.devchinaActivity可以显示出方法的签名。
其中Sigature:后面的就是方法的签名。
注意:c调用java,一般是把native的方法,放到c需要回调的java类中。这样就能直接把该类的对象
传递给c了。
例:
JNIEXPORT void JNICALL Java_com_devchina_ndk4_DevchinaProvider_callCcode (JNIEnv * env, jobject obj){//ojb,谁调用了此Native方法,这个Obj就是谁,这个要在回调就去中使用,所以要传递该方法所在的类对象。 //new 出java对象 jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");//注意:不能为“.” if(clazz==0){//没有找到类 LOGI("can't find devchina class"); }else{ LOGI("find dechina class"); } //获取类中的方法 jmethodID j_method = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");//最后一个参数是表示方法的签名 if(j_method==0){ LOGI("can't get method"); }else{ LOGI("get method"); } (*env)->CallVoidMethod(env,obj,j_method);//第二个参数表示调用的类对象,需要是在该类中调用native方法,传递的Obj
时间: 2025-01-20 11:46:56