1 java调用c++
在java中声明本地方法。在java中调用本地方法,回调c++。
public static native void onImageSaved(String path);
在c++中实现上述声明的方法
//--------Java回调C++--------native 方法
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
extern "C"
{
void Java_org_cocos2dx_cpp_ImagePicker_onImageSaved(JNIEnv *env,jobject thiz,jstring path)
{
std::string strPath = JniHelper::jstring2string(path);
Director::getInstance()->getScheduler()->performFunctionInCocosThread([strPath]()mutable{
Director::getInstance()->getEventDispatcher()->dispatchCustomEvent("ImagePickerEvent",&strPath);
log("========000-path:%s",strPath.c_str());
});
}
}
#endif
该方法名的声明是固定的。
Java_org_cocos2dx_cpp_ImagePicker_onImageSaved
Java_src文件夹下的文件名_java中声明该方法的类名_java中声明的方法名
方法中的参数
JNIEnv jni本地接口
jobject
剩下的为声明方法中的参数,需要进行相应的转换。
2 c++调用java
#if ( CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID )
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
JniMethodInfo methodInfo; //jni函数信息结构体
bool isHave = JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/cpp/AppActivity","sendAutoReq","()V");
if (isHave)
{
//调用这个函数
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID); //CallStaticVoidMethod
log("----jni调用完成");
} else{
log("----jni调用失败");
}
#endif
}
根据方法类型的不同调用不同方法。具体查阅JniHelper.h。
获取静态方法 getStaticMethodInfo
调用静态方法 CallStaticVoidMethod