下面是一个C++调用Java API, 并在该Java API中将C++传递过来的字符串显示到TextView中的例子.
JAVA code:
public class jni_test extends Activity {
static private TextView tvLog; // 要使其能在被C++调用的API中使用, 必须加static
tvLog = (TextView) findViewById(...);
public int PrintLog(String msg, int i) {
tvLog.append(msg+i+"\n"); // 打印到TextView
return 1;
}
public String GetJavaString() {
String str = "String from Java!";
return str;
}
}
C++ code:
jobject getInstance(JNIEnv *env, jclass obj_cls)
{
jmethodID c_id = env->GetMethodID(obj_cls, "<init>", "()V");
jobject obj = env->NewObject(obj_cls, c_id);
return obj;
}
xxxxxxx(JNIEnv* env, jobject context)
{
jclass cls;
jobject obj;
jmethodID mid1, mid2;
cls = env->FindClass("com/sample/jni_test"); // com/sample对应AndroidManifest.xml中定义的package
if (cls != 0)
{
obj = getInstance(env, cls);
mid1 = env->GetMethodID(cls, "PrintLog", "(Ljava/lang/String;I)I");
if (mid1 !=0)
{
jstring jstrMSG = env->NewStringUTF("String from C!");
int ret = env->CallIntMethod(obj, mid1, jstrMSG, 3); // 用CallInt...是因为PrintLog返回int
__android_log_print (ANDROID_LOG_INFO, "TEST", "PrintLog ret: %d\n", ret); // 往LogCat打印
}
mid2 = env->GetMethodID(cls, "GetJavaString", "()Ljava/lang/String;");
if (mid2 !=0)
{
jstring str = (jstring)env->CallObjectMethod(obj, mid2); // 用CallObject...是因为GetJavaString返回String
const char *newStr = env->GetStringUTFChars(str, 0);
__android_log_print (ANDROID_LOG_INFO, "TEST", "GetJavaString ret: %s\n", newStr);
env->ReleaseStringUTFChars(str, newStr);
}
}
}