Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Please bear with me, I am an iPhone developer and this whole android this confuses me a bit.

I have some c++ methods that are called from a cocos2d-x CCMenuItem. Therefore I cannot send any parameters, according to the docs.

I need to open a url with the android browser which will require me to call a JAVA function to start a new intent.

I understand that I need to create a VM, however the below code gives me the error:

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

I was looking at this thread: Calling a java method from c++ in Android

But he uses parameters, and I can't do that. And I don't see where those are in his code to just make them myself.

I don't know what the string should be in the 'Find Class' method. Also, I assume it is pretty terrible to create a new VM instance in every method I need to call. How would I create one as a singleton to use across the board?

This is my c++ code called by my menu item:

#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();

And this is the JAVA Method that I need to call:

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

Honestly, I am struggling with this, any help is appreciated. Thanks.

like image 781
PRNDL Development Studios Avatar asked Jul 04 '12 02:07

PRNDL Development Studios


1 Answers

If you are looking at how to call a java method which does not take in any arguments, the format is jmethodID mid = env->GetStaticMethodID(myClass, "myMethod", "()V");

() is how you tell it does not take in any params.

Vsays it returns void. Ljava/lang/String;should be used if the method returns an object of type String.

like image 135
ben_joseph Avatar answered Sep 23 '22 14:09

ben_joseph