android jni中C++与java互相调用小结

android jni中C++与java互相调用小结


刚学jni 在C++与java互相调用中碰到不少困难,现在互相调用成功了,特此写文做结。


环境:android-ndk-r9c


1、java类代码:

public class FfmpegJni {
private int m_sId;
public FfmpegJni(){m_sId++;}


//natvie必须声明,用于生成C/C++代码。以下函数能成功调用动态库函数。
    public native String hello();
    

// 该函数在C++中调用不成功,因此,如果C++要调用java中类方法,我采用了一种技巧,就是采用下面的静态方法调用,参数把类对象传回来,这样就可以实现了。

// 为啥该调用无法成功希望大牛看到能给指点下,开开眼界。


    public void notification(){
    //System.out.println("Got a notification.");
Log.w("rLook", "Got a notification.");
    }
    

// 以下函数在C++中成功调用
    public static void notificationByStatic(Object obj){
    FfmpegJni jt=(FfmpegJni)obj;
    String s = String.format("Got a notification in a static method[%05d].", jt.m_sId++);
Log.w("rLook", s);
    //System.out.println("Got a notification in a static method.");
    }
}


2、CPP文件

// 调用java函数

// 调用java非静态,失败,原因未知,技巧采用下面静态调用来解决该问题

int CallNotification(JNIEnv *env, jobject &jthis)
{
jclass business_class = env->GetObjectClass(jthis);
jmethodID notification_method = env->GetMethodID(business_class, "notification", "()V");
env->CallVoidMethod(business_class, notification_method);
return 0;
}

// 调用java静态,成功!
int CallNotificationS(JNIEnv *env, jobject &jthis)
{
jclass business_class = env->GetObjectClass(jthis);
jmethodID notification_method_static = env->GetStaticMethodID(business_class, "notificationByStatic", "(Ljava/lang/Object;)V");
env->CallStaticVoidMethod(business_class, notification_method_static, jthis);
env->CallStaticVoidMethod(business_class, notification_method_static, jthis);
env->CallStaticVoidMethod(business_class, notification_method_static, jthis);
return 0;
}


// 被java调用
jstring Java_com_app_z_rlook_FfmpegJni_hello
  (JNIEnv *env, jobject jthis){
CallNotificationS(env, jthis);
//CallNotification(env, jthis);
    return env->NewStringUTF("Hello jni!");
}


你可能感兴趣的:(android开发)