Calling a java method from c++ in Android Calling a java method from c++ in Android android android

Calling a java method from c++ in Android


If it's an object method, you need to pass the object to CallObjectMethod:

jobject result = env->CallObjectMethod(obj, messageMe, jstr);

What you were doing was the equivalent of jstr.messageMe().

Since your is a void method, you should call:

env->CallVoidMethod(obj, messageMe, jstr);

If you want to return a result, you need to change your JNI signature (the ()V means a method of void return type) and also the return type in your Java code.


Solution posted by Denys S. in the question post:

I quite messed it up with c to c++ conversion (basically env variable stuff), but I got it working with the following code for C++:

#include <string.h>#include <stdio.h>#include <jni.h>jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj){    jstring jstr = (*env)->NewStringUTF(env, "This comes from jni.");    jclass clazz = (*env)->FindClass(env, "com/inceptix/android/t3d/MainActivity");    jmethodID messageMe = (*env)->GetMethodID(env, clazz, "messageMe", "(Ljava/lang/String;)Ljava/lang/String;");    jobject result = (*env)->CallObjectMethod(env, obj, messageMe, jstr);    const char* str = (*env)->GetStringUTFChars(env,(jstring) result, NULL); // should be released but what a heck, it's a tutorial :)    printf("%s\n", str);    return (*env)->NewStringUTF(env, str);}

And next code for java methods:

    public class MainActivity extends Activity {    private static String LIB_NAME = "thelib";    static {        System.loadLibrary(LIB_NAME);    }    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        TextView tv = (TextView) findViewById(R.id.textview);        tv.setText(this.getJniString());    }    // please, let me live even though I used this dark programming technique    public String messageMe(String text) {        System.out.println(text);        return text;    }    public native String getJniString();}