我已经更改了android ndk的HelloJni示例,我想写一些东西到stdout。这是Jni代码:
#include <stdlib.h>
#include <jni.h>
#include <stdio.h>
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
printf("Hello from C !\n");
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
这是我的日志:
09-28 13:07:02.906: I/ActivityManager(1650): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.hellojni/.HelloJni u=0} from pid 1790
09-28 13:07:03.007: D/dalvikvm(1650): GC_FOR_ALLOC freed 687K, 10% free 9300K/10247K, paused 62ms, total 62ms
09-28 13:07:03.070: D/dalvikvm(3562): Not late-enabling CheckJNI (already on)
09-28 13:07:03.085: I/ActivityManager(1650): Start proc com.example.hellojni for activity com.example.hellojni/.HelloJni: pid=3562 uid=10052 gids={1015, 1028}
09-28 13:07:03.101: I/dalvikvm(3562): Turning on JNI app bug workarounds for target SDK version 3...
09-28 13:07:03.132: D/dalvikvm(3562): Debugger has detached; object registry had 1 entries
09-28 13:07:03.171: D/dalvikvm(3562): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x414af318
09-28 13:07:03.179: D/dalvikvm(3562): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x414af318
09-28 13:07:03.179: D/dalvikvm(3562): No JNI_OnLoad found in /data/data/com.example.hellojni/lib/libhello-jni.so 0x414af318, skipping init
09-28 13:07:03.265: V/TabletStatusBar(1715): setLightsOn(true)
09-28 13:07:03.328: I/ActivityManager(1650): Displayed com.example.hellojni/.HelloJni: +279ms
09-28 13:07:07.078: E/ThrottleService(1650): problem during onPollAlarm: java.lang.IllegalStateException: problem parsing stats: java.io.FileNotFoundException: /proc/net/xt_qtaguid/iface_stat_all: open failed: ENOENT (No such file or directory)
我已将log.redirect-stdio设置为true,以便我可以在LogCat中看到Hello行。
有人知道如何开展这项工作吗?感谢。
为了更清楚,我想要做的是在stdout中查看我的输出。没有问题,我只是想知道我是否可以输出到stdout。感谢谁给出了解决方案__android_log_print。
答案 0 :(得分:15)
Android Studio
如果您使用Android Studio和gradle,则会忽略Android.mk。将其添加到build.gradle文件中:
android {
defaultConfig {
ndk {
moduleName "your_module_name"
ldLibs "log"
}
}
}
<强>的Eclipse 强>
您需要将LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
添加到Android.mk文件..
你只需要定义自己的帮助宏,就像这样......
#include <android/log.h>
#define LOGV(TAG,...) __android_log_print(ANDROID_LOG_VERBOSE, TAG,__VA_ARGS__)
#define LOGD(TAG,...) __android_log_print(ANDROID_LOG_DEBUG , TAG,__VA_ARGS__)
#define LOGI(TAG,...) __android_log_print(ANDROID_LOG_INFO , TAG,__VA_ARGS__)
#define LOGW(TAG,...) __android_log_print(ANDROID_LOG_WARN , TAG,__VA_ARGS__)
#define LOGE(TAG,...) __android_log_print(ANDROID_LOG_ERROR , TAG,__VA_ARGS__)
效果很好。
答案 1 :(得分:14)
使用Android日志记录功能:
#include <android/log.h>
....
__android_log_print(ANDROID_LOG_VERBOSE, "MyApp", "The value of n is %d", n);
请注意在编辑问题后阅读此内容的人:问题最初没有指明OP不想使用&lt; android / log.h&gt;中的函数。 /子>
答案 2 :(得分:4)
要通过本机代码打印到Logcat,您必须使用Android的本机Logger。
类似的东西:
#include <jni.h>
#include <android/log.h>
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,DEBUG_TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,DEBUG_TAG,__VA_ARGS__)
你在你的功能中使用它:
LOGD("hello");
为了使其工作,你必须在编译中添加本机LOG:(Android.mk)
LOCAL_LDLIBS := -llog