gpt4 book ai didi

c++ - 无法使用 JNI 从 C++ 调用 Java

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:06 25 4
gpt4 key购买 nike

我有一个使用 cocos2d-x 库的小项目。我正在尝试使用 C++ 调用 Java 函数,但我在第 11 行收到信号异常:

// Get Status
status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);

但我不知道为什么会这样。

在我的 Java 类 Getsocial.java 中存在这个函数:

private void tweet()    {        String score = "123";        String tweetUrl = "https://twitter.com/intent/tweet?text=Hello ! I have just got " + score + " points in mygame for Android !!!!";        Uri uri = Uri.parse(tweetUrl);        startActivity(new Intent(Intent.ACTION_VIEW, uri));    }

此函数启动导航器以发布推文。从 Java 调用工作正常。

在我的 C++ InterfaceJNI.h 中我有:

#ifndef __INTERFACE_JNI_H__#define __INTERFACE_JNI_H__#include "cocos2d.h"class InterfaceJNI{public:    static void postMessageToFB();    static void postMessageToTweet();protected:};#endif // __INTERFACE_JNI_H__

在 InterfaceJNI.cpp 中:

#include "InterfaceJNI.h"#include "platform/android/jni/JniHelper.h"#include  jni.h >#include  android/log.h >using namespace cocos2d;void InterfaceJNI::postMessageToTweet(){    int status;    JNIEnv *env;    JavaVM *jvm;    jmethodID mid;    jclass mClass;    bool isAttached = false;    CCLog("Static postMessageToTweet");    // Get Status    status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);    CCLog("Status: %d", status);    if(status AttachCurrentThread(&env, NULL);        CCLog("Status 2: %d", status);        if(status GetStaticMethodID(mClass, "tweet", "()V");    CCLog("mID: %d", mid);    if (mid!=0)        env->CallStaticVoidMethod(mClass, mid);            //-----------------------------------------------------------    CCLog("Finish");    if(isAttached)        jvm->DetachCurrentThread();    return;}

此接口(interface)是从代码的一部分调用的:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)    InterfaceJNI::postMessageToTweet();#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)    ObjCCalls::trySendATweet();#endif

在 jvm->GetEnv((void **) &env, JNI_VERSION_1_6) 上返回一个空指针会发生什么? ?

最佳答案

看起来您的 jvm 变量为空或垃圾。我使用的 Cocos2D-x 版本有一个名为 JniHelper 的类,带有 static::getJavaVM();您可能想要使用的方法。

JavaVM* vm = JniHelper::getJavaVM();
JNIEnv* env;

vm->GetEnv((void**)&env,JNI_VERSION_1_4); // mine uses JNI_VERSION_1_4

此外,请记住在每次使用 NDK 构建时“刷新”您的 eclipse 项目。您可能已经这样做了,但值得检查一下。

关于c++ - 无法使用 JNI 从 C++ 调用 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12679346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com