Skip to content Skip to sidebar Skip to footer

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 canno

Solution 1:

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.


Solution 2:

A number of things...

  1. Given the declaration JNIEnv* env;, and given that you're in C++, you use it as env->FindClass(someString), not how you're doing it. If it was C you'd use FindClass(env, someString) but in C++ you use env->FindClass(someString).
  2. The string to use in FindClass is the fully qualified path name but with / as the delimiter instead of . For example, if the class is Foo in package bar.baz.quux, the fully-qualified name is bar.baz.quux.Foo and the string you'd give to FindClass is bar/baz/quux/Foo.
  3. You can only create one JVM per C++ process. I'm pretty sure you need to create a single JVM one time. You will therefore need to have the JavaVM* vm be a global variable (or at least be somewhere accessible to everything that needs to use. Everything in the same C++ thread as the thread that called JNI_CreateJavaVM() will use the JNIEnv * that gets filled in by that call. Every other thread that wants to use the JVM needs to call AttachCurrentThread which will bind that thread to the JVM and fill in a new JNIEnv * valid for that thread.
  4. Have you double-checked your compiler/IDE settings to make sure that the JDK_HOME/include directory (which contains jni.h) is in the includes search path? Same for the JDK_HOME/include/android directory (or whatever the operating specific directory in JDK_HOME/include is called in a Android JDK)?

A very useful resource is The JNI book

But be careful while reading it because some examples are in C and some are in C++, so make sure you understand how the calling conventions differ.


Post a Comment for "Calling A JAVA Method From C++ With JNI, No Parameters"