如何从NDK中的本机代码打印到Android屏幕上?

时间:2015-11-09 10:14:46

标签: android android-ndk

我希望将我的本机代码中的printf语句的输出(在C中)打印到android屏幕上。由于我希望在Android屏幕上看到许多输出,我想要的东西比JNI函数末尾的返回语句更多,每个函数都打印一个文本。怎么去呢?

编辑:

例如在我的C代码中,如果我希望在“Hello World”这样的函数中间打印某些内容,我该怎么办?现在,我可以使用only from return!方法在Android屏幕上打印“setText”。

jstring Java_com_example_encryptString( JNIEnv* env, jobject thiz) 
{
   printf("Hello World");
   return (*env)->NewStringUTF(env, "only from return!");
}

我知道一种方法,我从Java类调用此方法并使用TextViews在android屏幕上打印它。但是,这可以只打印和打印函数返回的值而不打印任何其他值。我不能打印该函数未返回的任何其他值吗?

感谢。

注意:我不是在寻找logcat中的android日志。

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你的意思是用C代码在TextView中设置文本,对吗?

如果是这样,你可以这样做。您需要将TextView作为参数传递给您的本机方法。然后在您的本机代码调用中找到它的setText方法并调用它。

您可以详细了解thread on SO或此page

您将本机方法更改为:

jstring Java_com_example_encryptString( JNIEnv* env, jobject thiz, jobject jtextViewObject, ...)
{
    //getting set text method
    jclass clazz = (*env)->FindClass(env, "android/widget/TextView");
    jmethodID setText = (*env)->GetMethodID(env, clazz, "setText", "(Ljava/lang/CharSequence;)V");

    ... do stuff ...

    //set text to text view
    jstring jstr = (*env)->NewStringUTF(env, "This comes from jni.");
    (*env)->CallVoidMethod(env, jtextViewObject, setText, jstr);

    ... do stuff ...

    return (*env)->NewStringUTF(env, "only from return!");
}

您还需要在java代码中更改本机方法的签名,以在参数中添加TextView