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

re3*_*3el 5 android android-ndk

我希望将printf本机代码(in C)中语句的输出打印到 android 屏幕上。由于我希望在 android 屏幕上看到许多输出,因此我想要的不仅仅是 JNI 函数末尾的 return 语句,它为每个函数打印一个文本。怎么办?

编辑:

例如在我的 C 代码中,如果我想在像“ Hello World”这样的函数中间打印一些东西,我该怎么办?现在,我可以only from return!使用setText方法在 android 屏幕上打印“ ” 。

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

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

谢谢。

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

son*_*nic 4

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

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

您可以在 SO或此页面上阅读有关此主题的更多信息。

您将把您的本机方法更改为如下所示:

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!");
}
Run Code Online (Sandbox Code Playgroud)

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

  • 代码中有一个小问题..它应该是 `(Ljava/lang/CharSequence;)V` 而不是 `(Ljava/lang/String;)V` (2认同)
  • 请注意,按照现在的编写方式,必须从主(UI)线程调用本机方法“encryptString()”。 (2认同)