cocos2dx 3.x Android 项目中,涉及到cocos 调用 java 和 java 调用cocos 的情况,因此需要使用jni.
cocos c++ 调用 java
c++ 调用 java 静态方法:
C++ 代码:
std::string CppBridgeToJava::getAppName(){
const std::string classPath = "org.cocos2dx.cpp.jni.CppBridgeToJava";
std::string s1 = JniHelper::callStaticStringMethod(classPath, "getAppName");
return s1;
}
Java 代码:
public static String getAppName(){
String packageName = AppUtils.getPackageName();
return packageName;
}
c++ 调用java 非静态方法:
C++ 代码:
void CppBridgeToJava::signInFromGoogle(bool forceLogin){
const std::string classPath = "org.cocos2dx.cpp.AppActivity";
JniMethodInfo info;
//判断org/cocos2dx/cpp/AppActivity.java中是否存在getActivity静态函数
bool ret = JniHelper::getStaticMethodInfo(info,classPath.c_str(),"getActivity","()Ljava/lang/Object;");
jobject jobj;
if(ret)
{
jobj = info.env->CallStaticObjectMethod(info.classID,info.methodID);//调用getObj函数,返回一Activity个对象
}
//判断org/cocos2dx/cpp/AppActivity.java中是否存在func1非静态函数
bool re = JniHelper::getMethodInfo(info,classPath.c_str(),"googleLogin","(Z)V");
if(re)
{
info.env->CallVoidMethod(jobj,info.methodID,forceLogin);//通过返回的对象调用非静态函数
}
}
Java 代码:
public static Object getActivity() {
return AppCore.getmCurrentActivity();
}
public void googleLogin(boolean forceLogin) {
mForceLogin = forceLogin;
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestId()
.requestProfile()
.requestEmail()
.requestIdToken(GOOGLE_CLIENT_ID)
.build();
}
java 调用 cocos c++
Java 代码:
public native String getSceneName();
public native void canShowOfferWallCallBack(boolean success);
C++ 代码:
JNIEXPORT jstring JNICALL Java_org_cocos2dx_cpp_jni_JavaBridgeToCpp_getSceneName
(JNIEnv *env, jobject object){
auto cur = Director::getInstance()->getRunningScene();
jstring value = env->NewStringUTF(cur->getName().c_str());
return value;
}
JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_jni_JavaBridgeToCpp_showOfferWallCallBack
(JNIEnv *env, jobject object, jint coins){
auto* scene = Director::getInstance()->getRunningScene();
const char* mainSceneName = "MainScene";
if(strcmp(mainSceneName,scene->getName().c_str()) == 0){
((MainScene*)scene)->showOfferWallCallBack(coins);
}
}
JNI 头文件可以通过命令生成: javah -d /jni org.cocos2dx.cpp.jni.JavaBridgeToCpp; -d 生成头文件路径