android 打印 stderr

mark android 默认的 stderr 没有重定向到 logcat ,如果想在 logcat 上打印本地程序的错误信息,可以输入下列命令。 adb shell stop adb shell setprop log.redirect-stdio true adb shell start

February 11, 2014

android-jni技术-回调

前面介绍了jni的基本概念和如何使用jni技术达到 Java 调用 C 的目的。 但是没有说 C 如何通过 jni 来调用 java 的方法,也就是如何实现回调。实现回调的作用很大,例如我们使用了 upnp 本地库,当库接收到消息便需要往 java 端传递。又例如使用了 C 实现了播放器,但是进度显示需要使用到 java。这些时候就需要用到回调了。 ##实现 先看看主要部分 :::java static void callback_handler(char *s) { int status; JNIEnv *env; bool isAttached = false; status = gJavaVM->GetEnv((void **) &env, JNI_VERSION_1_4); if(status < 0) { LOGE("callback_handler: failed to get JNI environment, " "assuming native thread"); status = gJavaVM->AttachCurrentThread(&env, NULL); if(status < 0) { LOGE("callback_handler: failed to attach " "current thread"); return; } isAttached = true; } /* Construct a Java string */ jstring js = env->NewStringUTF(s); jclass interfaceClass = env->GetObjectClass(gInterfaceObject); if(!interfaceClass) { LOGE("callback_handler: failed to get class reference"); if(isAttached) gJavaVM->DetachCurrentThread(); return; } /* Find the callBack method ID */ jmethodID method = env->GetStaticMethodID( interfaceClass, "callBack", "(Ljava/lang/String;)V"); if(!method) { LOGE("callback_handler: failed to get method ID"); if(isAttached) gJavaVM->DetachCurrentThread(); return; } env->CallStaticVoidMethod(interfaceClass, method, js); if(isAttached) gJavaVM->DetachCurrentThread(); } 假设在 java 工程中有一个叫 callBack 的静态方法,接收 string 类型的参数。我们就可以通过调用例子中的方法实现。 ...

February 8, 2014

bye 2013, hello 2014

It is the best of times.It is the worst of times 上面的话足够我概括这一年的经历了。 ##离家 之前的公司倒了,是留在本地工作装土豪,还是去外面当个屌丝?这个问题我犹豫了很久。最后还是选择了走出去,寻梦想,寻未来。虽然离家也不远。 ##工作 从一家创业公司到另一个创业公司,同样是做消费类电子,但是做的工作更加有挑战性了,这是比较满意的一点。 一直都想做些系统层和底层的工作愿望得到的实现。一样是围绕着 android 做工作,但是内容为 frameworks 和 linux kernel 了。 ##学习 学习围绕着两个主题进行,英语和计算机。 说说英语,这一年对于英语的学习热情一点也不高,虽然报了班,跑了几趟广外,但是这并不说明什么,最重要的是内功的修炼,是去记和背,去用英语思维思考,去听,说和写。很惭愧,没做好。 俗话说不x不知身体好,不赌不知时运高。同理,没做过编程都不知道要学习这么多东西。但是说到底,最核心的是思想,例如是否有面向对象的思想写出来的程序是不一样的。在我看来算法也算是思想的一种体现,简单的比如求 fibonacci 数列通项,用数组做和用递归做的时间差是几何级数的。 ##生活 买了部阅读神器 kindle 。阅读量倍增,而且涉及的范围也变广了。今年读了的书有 Android 系统源代码情景分析 人月神话 看见 动物农场 家 黄金时代 rework 嫌疑人x的献身 白夜行 写给大家看的设计书 今年最开心的一件事就是去旅行了,对于从没有出过国,坐过飞机的孩子真心是个突破(估计被很多人鄙视)。东南亚的小岛很漂亮,人们也很热情,同时看到很多华人在那边奋斗着。当然了,美食很多。 ##TODO 2014对于程序员真是充满了机会。只要潜心修炼,关注动态,勤于思考,敏捷执行,我们做的东西可以很多。 我要做的事也很多,要努力鞭策自己了。 英语 算法 linux编程 android 与 ios 以上是2014的基调,希望能买 macbook air 。一是移动需要,其次是程序员利器。 不管愿意不愿意,我们都要对 2013 说再见了。你好 2014。

January 1, 2014

ffmpeg教程二:屏幕显示

SDL and Video 显示图像的方法有很多,这里我们使用 SDL 。SDL 英文全称为 Simple Direct Layer 。是一个跨平台的多媒体库,也就是你可以在 windonws linuxe 和 mac 里面使用这个库。所谓的多媒体库,就是提供了图像显示,声音播放,和线程相关接口的库。在 linux 上安装这个库很简单,示例代码的 README 已经有写了。 SDL 提供了很多显示图片的方法,SDL显示图片是通过把数据显示在 YUV 层实现的。YUV 是显示原始数据的一种方法,类似于 RGB,通俗地说, Y 代表亮度系数, U 和 V 代表颜色系数。SDL的工作方式是把 YUV数据传进 YUV 层并显示。它接受4种 YUV 格式,但其中 YV12 是最快的。另一种格式叫 YUV420P 和 YV12 差不多,只是 U 和 V 调转了。420 的意思是每个样本的比例是 4:2:0 ,也就是每4个亮度分量共享一个颜色分量。这样可以节省带宽,而且人类对于颜色分量不太敏感,即使去掉几个也看不出差别。“P” 的意思是数据是 Y U V 在不同的数组中。ffmpeg 能够把图像转为 YUV420P, 其实很多视频已经使用这种格式存储图像,或者很容易就可以转为到这种格式。 现在如果想要显示图像,我们要把之前的代码中的 SaveFrame 函数替换掉。但是首先,我们先要知道怎么用 SDL 。 首先需要把库包含进来并初始化 SDL: :::c #include <SDL.h> #include <SDL_thread.h> if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) { fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError()); exit(1); } SDL_Init 告诉库我们先要用什么功能。SDL_GetError 显然是用来处理 debug 信息的函数。 ...

December 31, 2013

C++ 如何选用合适的容器

在 stackoverflow 里面掏到一张图,对选用容器有很好的指导作用,故贴在此。

December 17, 2013