【问题标题】:How to print onto android screen from native code in NDK?如何从 NDK 中的本机代码打印到 android 屏幕上?
【发布时间】:2016-02-09 23:06:40
【问题描述】:

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

编辑:

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

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

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

谢谢。

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

【问题讨论】:

  • 在你的布局中加入一个或多个TextViews 并调用他们的setText 方法。
  • @Michael:这不是打印本机函数的返回值吗?如果是这样,每次我想打印时都写一个函数会不会太累了。我是这里的新手,对我的平庸感到抱歉。
  • “这不是打印原生函数的返回值吗?”。嗯?您可以在函数中放置任意数量的日志打印(以及任意数量的setText 调用)。
  • @Michael 不太清楚你的意思。您能否提及您正在谈论的内容的示例代码?
  • @Michael:如果我不清楚,我希望从 C 中的本机代码打印,而不是 java。

标签: android android-ndk


【解决方案1】:

如果我正确理解了您的问题,您的意思是通过 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

【讨论】:

  • 是的,这可能是我期待的解决方案。我在构建项目时收到expected expression before 'jmethodID'error。如何解决?
  • 在评论以上行后,我收到Illegal class name /android/widget/TextView 错误和许多其他错误。
  • 好的。也许尝试jclass clazz = (*env)->GetObjectClass(env, jtextViewObject); 而不是jclass clazz = (*env)->FindClass(env, "/android/widget/TextView");
  • 代码中有一个小问题。应该是(Ljava/lang/CharSequence;)V而不是(Ljava/lang/String;)V
  • 注意,按照现在的写法,原生方法encryptString()必须从主(UI)线程调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多