从 cocos2d-x 到 Android 的 JNI 调用不会在发布模式下触发
Call JNI from cocos2d-x to Android is not triggered in Release Mode
我在发布模式下从 cocos2d-x (C++) 到 Android 本机 (Java) 的调用函数有问题。
在 cocos2d-x 中,我有一个函数:logInToGamePlayServices,它将在 Java 端调用一个函数开始登录游戏服务。它在调试模式下正常工作。但是当我制作要上传到商店的发布版本时,不会触发此功能。
我的构建设置:
编译SDK版本:API 27:Android 8.1 (Oreo)
目标 SDK 版本:API 27:Android 8.1 (Oreo)
最小 SDK 版本:API 15:Android 4.0.3 (IceCreamSandwich)
构建工具版本:28.0.3
NDK: android-ndk-r16b
Cocos2d-x: v3.17
C++:
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
USING_NS_CC;
void NativeHelper::logInToGamePlayServices() {
JniMethodInfo methodPlayGame;
if (JniHelper::getStaticMethodInfo(methodPlayGame, "games/core/CoreActivity", "logInToGamePlayServices", "()V")) {
methodPlayGame.env->CallStaticVoidMethod(methodPlayGame.classID, methodPlayGame.methodID);
}
}
Android 原生:
package games.core;
public class CoreActivity extends Cocos2dxActivity {
public static void logInToGamePlayServices() {
_shareInstance.runOnUiThread(new Runnable() {
public void run() {
Intent signInIntent = _shareInstance.mGoogleSignInClient.getSignInIntent();
_shareInstance.startActivityForResult(signInIntent, RC_SIGN_IN);
}
});
}
}
默认情况下,发布版本会使用 ProGuard 混淆。如果您计划使用来自 JNI 或通过反射的一些 Java 回调,则必须明确排除这些方法的混淆。在 .
中可以找到更多示例
我在发布模式下从 cocos2d-x (C++) 到 Android 本机 (Java) 的调用函数有问题。
在 cocos2d-x 中,我有一个函数:logInToGamePlayServices,它将在 Java 端调用一个函数开始登录游戏服务。它在调试模式下正常工作。但是当我制作要上传到商店的发布版本时,不会触发此功能。
我的构建设置:
编译SDK版本:API 27:Android 8.1 (Oreo)
目标 SDK 版本:API 27:Android 8.1 (Oreo)
最小 SDK 版本:API 15:Android 4.0.3 (IceCreamSandwich)
构建工具版本:28.0.3
NDK: android-ndk-r16b
Cocos2d-x: v3.17
C++:
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
USING_NS_CC;
void NativeHelper::logInToGamePlayServices() {
JniMethodInfo methodPlayGame;
if (JniHelper::getStaticMethodInfo(methodPlayGame, "games/core/CoreActivity", "logInToGamePlayServices", "()V")) {
methodPlayGame.env->CallStaticVoidMethod(methodPlayGame.classID, methodPlayGame.methodID);
}
}
Android 原生:
package games.core;
public class CoreActivity extends Cocos2dxActivity {
public static void logInToGamePlayServices() {
_shareInstance.runOnUiThread(new Runnable() {
public void run() {
Intent signInIntent = _shareInstance.mGoogleSignInClient.getSignInIntent();
_shareInstance.startActivityForResult(signInIntent, RC_SIGN_IN);
}
});
}
}
默认情况下,发布版本会使用 ProGuard 混淆。如果您计划使用来自 JNI 或通过反射的一些 Java 回调,则必须明确排除这些方法的混淆。在 .
中可以找到更多示例