This question already has answers here:
Call c function from Java

(11个答案)


去年关闭。




我使用生成Xcode或Android项目的引擎制作应用程序,而我主要将Xcode用于我的项目。但是,我希望第一次使用Android Studio。

在生成的Android Studio项目中,我有一个PTServicesBridge类,在其中我为引擎外的其他功能添加了自己的代码。 (在这种情况下,我需要将得分变量向上调整,但设为1)。

PTServicesBridge类:
public class PTServicesBridge
    public static PTServicesBridge instance() {
        if (sInstance == null)
            sInstance = new PTServicesBridge();
        return sInstance;
    }

    public static void initBridge(Cocos2dxActivity activity, String appId){
        //some initialisations
    }

    //...

    public static void adjustScoreUp(){
        //I need to call a function from here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    }
}

该项目包括一个main.cpp文件,该文件包含我需要调用的方法。

Main.cpp
#include "screens/PTPScoreController.h"

using namespace cocos2d;

extern "C"
{
    jint JNI_OnLoad(JavaVM *vm, void *reserved){
    JniHelper::setJavaVM(vm);
    return JNI_VERSION_1_4;
}

//...

void adjustScoreUpNow{
    PTPScoreController::scores().points.addCurrent(1); //This method <<<<<<<<<<
}

如何从adjustScoreUpNow类中调用PTServicesBridge

编辑:
引擎支持人员告诉我这样做。我希望有一个简单的解决方案,可以从Java类中调用.cpp方法。

最佳答案

PTServicesBridge中定义本机Java函数。就像是:

private static native void  adjustScoreUpNow();

main.cpp中提供以下实现
extern "C" {
JNIEXPORT void JNICALL Java_<full_package_name>_PTServicesBridge_adjustScoreUpNow(JNIEnv *env, jclass clazz) {
   //Call native side conterpart
   adjustScoreUpNow();
}
}

其中<full_package_name>应该是带有PTServicesBridge而不是_.包名称。

有关JNI如何工作的更多信息,请查看docs

09-12 16:45