【问题标题】:Call C++ method from Java class? [duplicate]从Java类调用C++方法? [复制]
【发布时间】:2019-09-04 19:05:01
【问题描述】:

我使用生成 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 <<<<<<<<<<
}

如何从PTServicesBridge 类中调用adjustScoreUpNow

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

【问题讨论】:

  • 感谢您的链接。我不认为这是重复的,因为 main.cpp 已经被使用了。所以我只需要知道如何从 java 类调用该文件中的方法。感谢您发帖。
  • 页面顶部链接问题的答案描述了如何使用 JNI 来做你想做的事。

标签: java android c++ class


【解决方案1】:

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();     
}
}

其中&lt;full_package_name&gt; 应该是PTServicesBridge 的包名称,_ 而不是.

有关 JNI 工作原理的更多信息,请查看docs

【讨论】:

  • 感谢您的发帖。不幸的是,我在控制台中收到以下错误:E/art: No implementation found for void com.secrethq.utils.PTServicesBridge.adjustScoreUpNow() (tried Java_com_secrethq_utils_PTServicesBridge_adjustScoreUpNow and Java_com_secrethq_utils_PTServicesBridge_adjustScoreUpNow__) D/AndroidRuntime: Shutting down VM 这很令人困惑,因为方法在那里。
  • @Reanimation 你确定你的方法可以进入库.so 吗?从您的 apk 中提取本机库或在本地构建中找到它,然后执行 objdump -TC &lt;lib.so location&gt; | grep adjustScoreUpNow。请注意objdump应该来自android NDK。
  • 生成的 Android Studio 项目已经有一个工作的 main.cpp。所以我刚刚添加了这个功能。如您所知,我没有使用 Android 或 Java 的经验。谢谢。
  • @Reanimation 我知道您使用 cocos2d,我什至已经在我身边生成了项目。如果main.cpp 被构建,它应该包含Java_&lt;full_package_name&gt;_PTServicesBridge_adjustScoreUpNow 函数。对?但是java无法加载它,所以.so库可能还没有更新。为了验证我上面提到的命令的提供结果。否则我将无法为您提供帮助
  • 感谢您的帮助。我找不到该位置,也不知道如何执行该命令。我认为这是忘记 Android 的标志:(
猜你喜欢
  • 2013-12-20
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多