簡體   English   中英

使用JNI從C ++調用JAVA方法,沒有參數

[英]Calling a JAVA method from C++ with JNI, no parameters

請耐心等待,我是一名iPhone開發人員,這整個Android讓我感到困惑。

我有一些從cocos2d-x CCMenuItem調用的c ++方法。 因此,根據文檔,我無法發送任何參數。

我需要用android瀏覽器打開一個url,這需要我調用一個JAVA函數來啟動一個新的intent。

我知道我需要創建一個VM,但下面的代碼給出了錯誤:

jni /../../ Classes / OptionsScene.cpp:184:錯誤:未在此范圍內聲明'JNI_CreateJavaVM'

我正在看這個帖子: 在Android中從c ++調用java方法

但他使用參數,我不能這樣做。 而且我不知道他們的代碼中有哪些內容可以自己創建。

我不知道'Find Class'方法中的字符串應該是什么。 此外,我認為在我需要調用的每個方法中創建一個新的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表示它返回無效。 Ljava/lang/String; 如果方法返回String類型的對象,則應該使用它。

很多事情......

  1. 鑒於JNIEnv* env;的聲明JNIEnv* env; 並且考慮到你使用的是C ++,你將它用作env->FindClass(someString)而不是你是如何做的。 如果是C,你可以使用FindClass(env, someString)但在C ++中你使用env->FindClass(someString)
  2. FindClass使用的字符串是完全限定的路徑名​​,但使用/作為分隔符而不是. 例如,如果類是Foo封裝bar.baz.quux ,完全合格的名稱是bar.baz.quux.Foo ,你想給字符串FindClassbar/baz/quux/Foo
  3. 每個C ++進程只能創建一個JVM。 我很確定你需要一次創建一個JVM。 因此,您需要將JavaVM* vm作為全局變量(或者至少可以在需要使用的所有內容中訪問。與調用JNI_CreateJavaVM()的線程在同一C ++線程中的所有內容都將使用填充的JNIEnv *想要使用JVM的每個其他線程都需要調用AttachCurrentThread ,它將該線程綁定到JVM並填入一個對該線程有效的 JNIEnv *
  4. 您是否仔細檢查了編譯器/ IDE設置以確保JDK_HOME/include目錄(包含jni.h )位於包含搜索路徑中? 對於JDK_HOME/include/android目錄(或者在JDK中調用JDK_HOME/include的操作特定目錄),相同嗎?

一本非常有用的資源是JNI書

但是在閱讀它時要小心,因為一些示例在C中,而一些示例在C ++中,因此請確保您了解調用約定的不同之處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM