使用JNI调用C ++的Java方法,没有参数

 2023-01-20    301  

问题描述

请忍受我,我是iPhone开发人员,整个Android这让我有些困惑.

i有一些C ++方法,这些方法是从Cocos2D-X CCmenuitem调用的.因此,根据文档,我无法发送任何参数.

使用JNI调用C ++的Java方法,没有参数

我需要使用Android浏览器打开一个URL,这需要我调用Java功能以启动新意图.

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

jni/../../class/optionsscene.cpp:184:错误:’jni_createjavavm’as
在此范围中未声明

我正在看这个线程:从C ++调用Java方法在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);
    }
}

老实说,我为此苦苦挣扎,任何帮助都将受到赞赏.谢谢.

推荐答案

许多事情…

  1. 给定声明JNIEnv* env;,并且鉴于您在C ++中,您将其用作env->FindClass(someString),而不是您如何做.如果是c,您将使用FindClass(env, someString),但是在C ++中,您使用env->FindClass(someString).
  2. 在FindClass中使用的字符串是完全限定的路径名​​,但/作为定界符,而不是.,例如,如果类是Foo,则包含Foo,则完全合格名称为bar.baz.quux.Foo,您要给FindClass的字符串是bar/baz/quux/Foo.
  3. 您只能创建每个C ++进程的JVM.我很确定您需要一次创建一个JVM.因此,您将需要使JavaVM* vm是一个全局变量(或至少可以使用所有需要使用的地方.由该调用填充.所有其他想要使用JVM的线程都需要调用AttachCurrentThread,该线程将将该线程绑定到JVM并填充A new JNIEnv *对该线程有效.
  4. 您是否仔细检查了编译器/IDE设置以确保JDK_HOME/include目录(包含jni.h)在包含搜索路径中?对于JDK_HOME/include/android目录(或在Android JDK中调用的任何操作特定目录)的目录相同吗?

一个非常有用的资源是 jni book p>

但是,在阅读时要小心,因为某些示例在C中,有些示例在C ++中,因此请确保您了解呼叫约定的不同.

其他推荐答案

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

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

V说它返回了无效. Ljava/lang/String;如果该方法返回类型String的对象.

以上所述是小编给大家介绍的使用JNI调用C ++的Java方法,没有参数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26041.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。