java - 使用 JNI 从 C++ 调用 JAVA 方法,无参数

标签 java android c++ jvm java-native-interface

请耐心等待,我是一名 iPhone 开发人员,而整个 android 这让我有点困惑。

我有一些从 cocos2d-x CCMenuItem 调用的 c++ 方法。因此,根据文档,我无法发送任何参数。

我需要用 android 浏览器打开一个 url,这将要求我调用一个 JAVA 函数来启动一个新的 intent。

我知道我需要创建一个虚拟机,但是下面的代码给我错误:

jni/../../Classes/OptionsScene.cpp:184: error: 'JNI_CreateJavaVM' was not declared in this scope

我在看这个帖子:Calling a java method from c++ in Android

但是他用参数,我做不到。而且我看不到这些在他的代码中的什么位置,只能自己制作。

我不知道“查找类”方法中的字符串应该是什么。 此外,我认为在我需要调用的每个方法中创建一个新的 VM 实例是非常糟糕的。我将如何创建一个单例以供全面使用?

这是我的菜单项调用的 C++ 代码:

#include <jni.h>
...
JavaVM *vm; // Global
...
void OptionsScene::website(){
JNIEnv *env;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = 1;

jint result = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args); // This line still errors

jclass clazz = env->FindClass("com/prndl/project/WebExecute");
jmethodID method = env->GetMethodID(clazz, "website", "(Ljava/lang/String;)V");
env->CallVoidMethod(NULL,method);

vm->DestroyJavaVM();

这是我需要调用的 JAVA 方法:

public class WebExecute extends Activity{
    public void website(){
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
        startActivity(browserIntent);
    }
}

老实说,我正在为此苦苦挣扎,感谢您的帮助。谢谢。

最佳答案

如果您正在查看如何调用不接受任何参数的 java 方法,格式为 jmethodID mid = env->GetStaticMethodID(myClass, "myMethod", "()V");

() 是您告诉它不接受任何参数的方式。

V 表示它返回 void。 Ljava/lang/String;如果方法返回类型为 String 的对象,则应使用。

关于java - 使用 JNI 从 C++ 调用 JAVA 方法,无参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11321677/

相关文章:

android - 获取 HttpResponse 对象作为来自 Android 中的 Volley api 的响应而不是 jsonobject 或字符串

android日志信息是 “W/OpenGLRenderer: Incorrectly called buildLayer on View”,这是什么意思?

android - Android 是否有等同于 iOS 的 Google Maps URL 方案?

c++ - 将字符与 C++ 中的空格进行比较?

java - 如何将一项 Activity 实现到另一项 Activity 中?

java - 使用 log4j2.xml 进行 Elasticsearch 配置

java - 线程中的异常 "main"java.lang.NullPointerException Java 错误

java - 枚举中的枚举

c++ - 如何从 bash 更改库包含二进制文件的路径?

c++ - 在 C++ 中,我们如何使用执行函数的有效 X(Args...) 语法调用所有内容?