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