Dec 11, 2008

转载:一个JNI下c和java程序范例

转自http://blog.chinaunix.net/u1/38994/showart_1100966.html

1.编辑jprint.java文件
gliethttp@Leith:~/Android$ cat jprint.java
public class jprint
{
/*******************************************************
*the print() function will call the printf() funcion which is a ANSI c funciton
********************************************************/
public native void print();
static
{
System.loadLibrary("jnilibs");
}
}
2.生成class和.h文件
gliethttp@Leith:~/Android$ javac jprint.java
这样会生成jprint.class
然后使用javah生成jprint.h文件
gliethttp@Leith:~/Android$ javah jprint
3.将jprint.h作为hello.c的头文件,并实现jprint.h中定义了的jni接口函数.
4.编写hello.c文件
gliethttp@Leith:~/Android$ cat hello.c
#include
#include "jprint.h"

JNIEXPORT void JNICALL Java_jprint_print(JNIEnv *env, jobject obj)
{
printf("hello,Android!\n###Leith_gliethttp.\n");
}
5.编译jni的java共享库
gliethttp@Leith:~/Android$ gcc -fPIC -I /usr/local/jdk1.5/include -I /usr/local/jdk1.5/include/linux -shared -o libjnilibs.so *.c
6.成功后会在当前目录下生成libjnilibs.so文件,将当前libjnilibs.so所在目录加入LIB路径变量中.
gliethttp@Leith:~/Android$ export LD_LIBRARY_PATH=.:./lib:/home/gliethttp/Android:$(LD_LIBRARY_PATH)
7.编写java应用程序,调用c中的print函数
gliethttp@Leith:~/Android$ cat gliethttp_hello.java
public class gliethttp_hello
{
public static void main(String[] args)
{
jprint p = new jprint();
p.print();
}
}
8.编译应用程序gliethttp_hello
gliethttp@Leith:~/Android$ javac gliethttp_hello.java
9.好了,一切完成了,执行看效果吧:
gliethttp@Leith:~/Android$ java gliethttp_hello
hello,Android!
###Leith_gliethttp.

PS:使用vim编辑java程序的时候,必须要注意的是,TAB按键一定要正确为^I,绝对不要用4个空格替代,否则
javac老是提示错误,对于vim可以使用ctrl+v+tab的输入来输入一个正确的TAB键,
可以使用:set list,:set nolist取消:).
PS1:应该这样建立目录,这样格式比较统一
|-- c_source
| |-- hello.c
| `-- jprint.h
|-- java
| |-- gliethttp_hello.java
| `-- jprint.java
|-- lib
| `-- libjnilibs.so

Dec 9, 2008

OpenCore分析

Android的MediaPlayer部分功能是基于Opencore的。
MediaPlayer调用MediaPlayerService使用到OpenCore内容
在MediaPlayerService:createPlayer的时候有三种player的type:
switch (playerType) {
case PV_PLAYER:
LOGV(" create PVPlayer");
p = new PVPlayer();
break;
case SONIVOX_PLAYER:
LOGV(" create MidiFile");
p = new MidiFile();
break;
case VORBIS_PLAYER:
LOGV(" create VorbisPlayer");
p = new VorbisPlayer();
break;
其中PVPlayer是调用OpenCore实现的
在阅读OpenCore的代码的时候,曾经走了一个弯路,就是在读代码的时候没有考虑向上调用的相关性,只看OpenCore内部的代码。
在读OpenCore的代码时opencore\Engines下封装了player和author,而且这两部分在pv提供的文档OpenCORE_brochure.pdf里也是描述成了主要的两个多媒体的处理引擎。
但是在实际的Android调用时,提供上层多媒体处理引擎接口的并不是player和author,而是在opencore/android/中的playerdriver(playerdriver.cpp)。
在分析代码是发现playerdriver的代码和opencore\Engines里的player基本是一样的。可以看出OpenCore集成入Android的时候,开发人员参考原有的引擎重写了接口。

起床啦

真实的反应了我和兔兔起床的过程

起床