您所在位置: 网站首页 / java JNI编程指南.doc / 文档详情
java JNI编程指南.doc 立即下载
2024-09-12
约9万字
约87页
0
520KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

java JNI编程指南.doc

javaJNI编程指南.doc

预览

免费试读已结束,剩余 82 页请下载文档后查看

15 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

题目有点大,呵呵。前边是高老师的东东,后边是我的小实践。话说当时Android还是1.5的。

AndroidJNI知识简介

JavaNativeInterface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够与用其它编程语言(如C、C++和汇编语言)编写的应用程序和库进行交互操作。

1.从如何载入.so档案谈起
由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM:VirtualMachine)来执行。VM在Android平台里,扮演很重要的角色。
此外,在执行Java类的过程中,如果Java类需要与C组件沟通时,VM就会去载入C组件,然后让Java的函数顺利地调用到C组件的函数。此时,VM扮演着桥梁的角色,让Java与C组件能通过标准的JNI介面而相互沟通。
应用层的Java类是在虚拟机(VM:VitualMachine)上执行的,而C件不是在VM上执行,那么Java程式又如何要求VM去载入(Load)所指定的C组件呢?可使用下述指令:
System.loadLibrary(*.so的档案名);
例如,Android框架里所提供的MediaPlayer.java类,含指令:
publicclassMediaPlayer{
static{
System.loadLibrary("media_jni");
}
}
这要求VM去载入Android的/system/lib/libmedia_jni.so档案。载入*.so之后,Java类与*.so档案就汇合起来,一起执行了。

2.如何撰写*.so的入口函数
----JNI_OnLoad()与JNI_OnUnload()函数的用途
当Android的VM(VirtualMachine)执行到System.loadLibrary()函数时,首先会去执行C组件里的JNI_OnLoad()函数。它的用途有二:
(1)告诉VM此C组件使用那一个JNI版本。如果你的*.so档没有提供JNI_OnLoad()函数,VM会默认该*.so档是使用最老的JNI1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI1.4的java.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知VM。
(2)由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定(Initialization)。
例如,在Android的/system/lib/libmedia_jni.so档案里,就提供了JNI_OnLoad()函数,其程式码片段为:
//#defineLOG_NDEBUG0
#defineLOG_TAG"MediaPlayer-JNI"
jintJNI_OnLoad(JavaVM*vm,void*reserved)
{
JNIEnv*env=NULL;
jintresult=-1;

if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){
LOGE("ERROR:GetEnvfailed\n");
gotobail;
}

assert(env!=NULL);

if(register_android_media_MediaPlayer(env)<0){
LOGE("ERROR:MediaPlayernativeregistrationfailed\n");
gotobail;
}

if(register_android_media_MediaRecorder(env)<0){
LOGE("ERROR:MediaRecordernativeregistrationfailed\n");
gotobail;
}

if(register_android_media_MediaScanner(env)<0){
LOGE("ERROR:MediaScannernativeregistrationfailed\n");
gotobail;
}

if(register_android_media_MediaMetadataRetriever(env)<0){
LOGE("ERROR:MediaMetadataRetrievernativeregistrationfailed\n");
gotobail;
}

/*success--returnvalidversionnumber*/
resu
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

java JNI编程指南

文档大小:520KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用