5

请多多包涵,我是一名 iPhone 开发人员,这整个 android 让我有点困惑。

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

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

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

jni/../../Classes/OptionsScene.cpp:184:错误:未在此范围内声明“JNI_CreateJavaVM”

我在看这个线程: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);
    }
}

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

4

2 回答 2

4

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

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

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

于 2018-01-10T12:57:04.290 回答
1

很多事情...

  1. 给定声明JNIEnv* env;,并假设您在 C++ 中,您将其用作env->FindClass(someString)而不是您的操作方式。如果它是 C,你会使用FindClass(env, someString),但在 C++ 中,你使用env->FindClass(someString).
  2. 要使用的字符串FindClass是完全限定的路径名​​,但/作为分隔符而不是. 例如,如果类Foo在 packagebar.baz.quux中,则完全限定的名称是bar.baz.quux.Foo并且您要提供的字符串FindClassbar/baz/quux/Foo
  3. 每个 C++ 进程只能创建一个 JVM。我很确定您需要一次创建一个 JVM。因此,您将需要JavaVM* vm成为一个全局变量(或者至少在某个地方可以访问需要使用的所有内容。与调用的线程相同的 C++ 线程中的所有内容都JNI_CreateJavaVM()将使用JNIEnv *由该调用填充的那个。所有其他线程想要使用 JVM 需要调用AttachCurrentThreadwhich 将该线程绑定到 JVM 并为该线程填写一个 JNIEnv *的有效值。
  4. 您是否仔细检查了编译器/IDE 设置以确保JDK_HOME/include目录(包含jni.h)位于包含搜索路径中?目录是否相同(或在 Android JDK 中调用的JDK_HOME/include/android任何特定操作目录)?JDK_HOME/include

一个非常有用的资源是The JNI book

但是在阅读时要小心,因为有些示例是用 C 语言编写的,有些是用 C++ 编写的,因此请确保您了解调用约定的不同之处。

于 2012-07-04T02:54:15.427 回答