2022年技术总结_Android平台的JNI开发_金文

上传人:博****1 文档编号:567303588 上传时间:2024-07-19 格式:PDF 页数:18 大小:1.92MB
返回 下载 相关 举报
2022年技术总结_Android平台的JNI开发_金文_第1页
第1页 / 共18页
2022年技术总结_Android平台的JNI开发_金文_第2页
第2页 / 共18页
2022年技术总结_Android平台的JNI开发_金文_第3页
第3页 / 共18页
2022年技术总结_Android平台的JNI开发_金文_第4页
第4页 / 共18页
2022年技术总结_Android平台的JNI开发_金文_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《2022年技术总结_Android平台的JNI开发_金文》由会员分享,可在线阅读,更多相关《2022年技术总结_Android平台的JNI开发_金文(18页珍藏版)》请在金锄头文库上搜索。

1、技术总结 -Android平台的JNI开发一、什么是 JNI JNI 是 Java Native Interface的缩写。标准 JAVA 库并不支持某些平台特性,可以用别的语言编写代码使得软件支持这些平台特性,也可能程序需要用低级语言编写一些算法以提高程序的效率.这些情况都可能是使用JNI 的原因。JNI 的编写步骤 : 1. 编写带有 native 声明的 java类;2. 编译 java文件成 class类;3. 使用 javah -jni com.ikags.project.XXXX 编译成 .h文件;4. 使用 C/C+编写代码;5. 将.h和.c (.cpp) 文件编译成 .dll

2、 (.so) 文件 (根据平台不同,用不同的工具,PC平台 VS2005 就可以, android平台的话,用 cygwin+android NDK (android Native Development Kit) 进行开发;6. 将.dll (.so) 文件提供给你的工程,用 system.loadLibrary方法调用。详细的讲解如下:1. 编写一个带有 native 声明的 java 类.其中 native方法就是需要生成的可调用的方法;代码:2. 编译成 class文件;可以通过命令行中的javac AJni.java进行编译 .最简单的方法,用 J2SE项目直接右键 run 然后,

3、可以在工程下的 bin 目录中找到 AJni.class文件。如果通过命令行编译会出现问题,请找到 JAVA文件夹下面对应 JDK 的 bin 目录, 把文件 copy 到里面执行 (或在环境变量中配置bin目录的位置 )。3. 使用 javah -jni com.ikags.project.XXXX 编译成 .h文件;通过命令行中的 javah -jni com.ikags.project.XXXX 编译成 .h文件, 其中在编译.h 文件的时候切记加入路径,这个有时候会引起一些奇怪的问题,精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,

4、共 18 页比如调用失败、调用不到、原因未知。如果编译失败的话,处理方法同编译成class文件, 请找到 JAVA 文件夹下面对应 JDK 的 bin 目录,把文件 copy 到里面执行 (或者在环境变量中配置Bin 目录的位置 ) 此时生成文件 com _ikags_AJni.h。4. 使用 C/C+编写代码;其中前一阶段生成的 .h头文件如下 :代码:这里是不需要进行任何更改的.只要自己再写一个 .c(.cpp)文件,其中包含有这三个方法即可, PC和 android平台支持的库不一样,如果调用了不支持的库的话,后面的编译会出错,这个需要特别注意一下。Android 平台目前 1.6的 N

5、DK 只支持 Math 库、C 标准库、 ZLib 库、Log 库和 OpenGL ES库。 (PC端的 JNI 支持 printf,但是如果 android 上不支持,精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 18 页这时候针对 android 平台开发的话编译时会出错) 。.c文件如下 :代码:5. PC端:直接通过 VS2005就可以编译 .编译时候如果出现找不到某些.h 文件的错误的话 (fatal error C1083: 无法打开包括文件L . No such file or directory) ,参考下面更改 :

6、工程-属性 -配置属性 -C/C+- 常规-附加包含目录”选项中有很多 include 下的库,将 JAVA JDK 里面 include 的和里面的 win32 这两个路径添加入目录中再尝试编译。一般来说代码正确可以编译通过,这里生成myjni.dll。Android 端:这里要通过 cygwin 和 android NDK 进行编译, android NDK 下载后直接解压就可以 . cygwin 需要安装几个 C的编译器。打开 cygwin 看到命令行模式,通过cd 命令进入 NDK 的目录,然后运行build/host-setup.sh可以看到一些信息,如果没有报错的话,就正常安装完毕

7、。编译本身命令很简单, make APP=hello-jni -B 就可以尝试编译自带实例.编译成功的话,说明配置成功,然后可以开始编译自己的程序。在 NDK 目录的 apps文件夹下,建立一个myjni 文件夹,从 hello 工程里面复制 Application.mk 到 myjni 文件夹里面,用文本编辑器编辑文本为APP_PROJECT_PATH := $(call my-dir) APP_MODULES := myjni 然后建立一个 jni 文件夹,从 hello 工程里面复制一个Android.mk 到 jni 文件夹目录,然后用文本编辑器更改里面的相关参数。LOCAL_PATH

8、:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := myjni LOCAL_SRC_FILES:= com_ikags_AJni.cpp 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 18 页include $(BUILD_SHARED_LIBRARY) 这时候把你的 .h和.c(.cpp)等文件复制到这个目录下,然后用cygwin 运行make APP=myjni -B 如果编码没有错误的话,会自动生成libsarmeabilibmyjni.so文件,至此 android的

9、 JNI 文件生成完成。6. 将.dll(.so)文件提供给你的工程,用system.loadLibrary方法调用;PC端:将 dll 文件复制入程序跟目录,保留第一步写的native Java代码.在需要用的代码里面加入 : static System.loadLibrary(myjni)。 在运行方法里面加入 : AJni newlib = new AJni() 。int i = newlib.plus (330,1003)。输出 i 即可测试是否有效;Android 端:将 libs 整个目录复制到 android工程下 .这里要注意的是loadLibrary 读取的名字和 lib 的

10、名字不同 .这里我们的 so文件为 libmyjni.so,但是我们下面写的loadLibrary 为 myjni ,这点是要注意下的在自己的 Activity 里面添加代码 : static System.loadLibrary (myjni)。 在运行方法里面加入 : AJni newlib = new AJni() 。int i = newlib.plus(330,1003)。这是可以用 Log.v 方法来查看 i 的数值。二、Android 系统整体架构以及多媒体框架的JNI 使用多媒体框架在整个Android 系统所处的位置精选学习资料 - - - - - - - - - 名师归纳总

11、结 - - - - - - -第 4 页,共 18 页从框架图可以看出Media Framework处于 Libraries 这一层,这层的Library 不是用Java实现,一般是 C/C+实现,它们通过 Java的 JNI 方式调用。多媒体架构:基于第三方 PacketVideo 公司的 OpenCORE platform来实现支持所有通用的音频,视频,静态图像格式CODEC(编解码器 )使用 OpenMAX 1L interface 接口进行扩展,可以方便得支持hardware / software codec plug-ins 支持的格式包括: MPEG4、H.264、MP3、AAC、

12、AMR 、JPG、PNG、GIF 等。Open Core多媒体框架有一套通用可扩展的接口针对第三方的多媒体遍解码器,输入,输出设备等等。多媒体文件的播放,下载,包括3GPP, MPEG-4,AAC and MP3 containers 流媒体文件的下载,实时播放,包括:3GPP, HTTP and RTSP/RTP 动态视频和静态图像的编码,解码,例如:MPEG-4, H.263 and AVC (H.264), JPEG 语音编码格式: AMR-NB and AMR-WB 音乐编码格式: MP3, AAC , AAC+ 视频和图像格式: 3GPP , MPEG-4 and JPEG 精选学习

13、资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 18 页视频会议:基于 H324-M standard 图中用黄线圈出的是Media Framework Open Core 介绍:Open Core是 Android 多媒体框架的核心,所有Android 平台的音视频采集,播放的操作都是通过它来实现。它也被称为PV(Packet Video), Packet Video是一家专门提供多媒体解决方案的公司。通过 Open Core程序员可以方便快速的开发出想要的多媒体应用程序,例如:音视频的采集,回放,视频会议,实时的流媒体播放等等应用。Open

14、 Core 框架代码结构:Open Core 的代码在 Android 代码的 External/Opencore目录中。这个目录是 OpenCore的根目录,其中包含的子目录如下所示:android:这里面是一个上层的库,它实现了一个为Android 使用的音视频采集,播放的接口,和 DRM 数字版权管理的接口实现。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 18 页baselibs :包含数据结构和线程安全等内容的底层库codecs_v2 :音视频的编解码器,基于OpenMAX 实现engines :核心部分,多媒体引擎的实现e

15、xtern_libs_v2:包含了 khronos的 OpenMAX 的头文件fileformats:文件格式的解读( parser )工具nodes :提供一些 PVMF 的 NODE ,主要是编解码和文件解读方面的。oscl:操作系统兼容库pvmi:输入输出控制的抽象接口protocols:主要是与网络相关的RTSP、RTP、HTTP 等协议的相关内容pvcommon:pvcommon库文件的 Android.mk 文件,没有源文件。pvplayer:pvplayer 库文件的 Android.mk 文件,没有源文件。pvauthor:pvauthor库文件的 Android.mk 文件,

16、没有源文件。tools_v2:编译工具以及一些可注册的模块。Open Core 上层代码结构在实际开发中我们并不会过多的研究Open Core 的实现, Android 提供了上层的Media API 给开发人员使用, MediaPlayer 和 MediaRecorder Android Media APIs The Android platform is capable of playing both audio and video media. It is also capable of playing media contained in the resources for an ap

17、plication, or a standalone file in the filesystem, or even streaming media over a data connection. Playback is achieved through the android.media.MediaPlayer class. The Android platform can also record audio. Video recording capabilities are coming in the future. This is achieved through the android

18、.media.MediaRecorder class. Media Player 提供的基本接口如下:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 18 页MediaPlayer类提供了一个多媒体播放器的基本操作,播放,暂停,停止,设置音量等等。简单的例子:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 18 页Media Recorder 提供的基本接口如下:简单的例子:整体的结构如下图所示:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - -

19、- -第 9 页,共 18 页MediaPlayer JNI 代码位置 /frameworks/base/media/jni MediaPlayer (Native) 代码位置 /frameworks/base/media/libmedia MediaPlayerService (Server) 代码位置 /frameworks/base/media/libmediaplayerservice MediaPlayerService Host Process 代码位置 /frameworks/base/media/mediaserver/main_mediaserver.cpp PVPlayer

20、 代码位置 /external/opencore/android/ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 18 页实际调用过程如下图所示:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 18 页三、实例开发利用 NDK 生成 SO 库,使用 SO 库进行 JNI 调用,在 Android sdcard 创建文件并写入数据。需要的工具:NDK1.5 R1 、android SDK1.5 R1、SDCARD、Eclipse 、ADT 0.9 、Eclipse Galil

21、eo for C/C+、Cygwin 1.5 。在 Windows XP 进行操作工具比较多,如果在 Ubuntu 或者其他的 Linux 系统下进行操作直接进入步骤 2 即可。步骤如下:1. 安装 Cygwin 使用本地安装包进行下载: http:/ 下载一个 38.2M 包即可。2. 安装 NDK 进入正题安装 NDK ,首先打开 cygwin ,然后使用 cd 命令进入 NDK 根目录,然后运行: build/host-setup.sh 如果出现以上的信息,说明安装正确,如果出现GCC 未找到,请输入 gcc 命令查看,如果出现 toolchain 未找到的信息,请试着修改 build/

22、host-setup.sh 文件第一行代码,将: #!/bin/sh 改成 #!/bin/bash,在 Ubuntu 上这个是需要修改的 。安装成后,使用 make 命令试试编译自带的程序,输入 make APP=hello-jni,hello-jni 为 apps 下 hello-jni 文件夹的名称,这个命令会先找到appshello-jni 下的 Application.mk 文件,然后找到 sourcesampleshello-jni 这个目录,然后找到 Android.mk 这个文件中的配置信息进行编译。如图:精选学习资料 - - - - - - - - - 名师归纳总结 - - -

23、 - - - -第 12 页,共 18 页出现上面的信息,说明编译成功,so 文件在 apps/hello-jni/project/libs/armeabi 文件夹下。3. 书写 java native 接口下面建立一个 android1.5 的工程, NDK 不支持 1.5 以下的版本JNI.java的代码:JniTest.java的代码:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 18 页4. 生成 JNI 头文件下面使用 javah 命令,对 JNI.java 这个文件生成生成 JNI 头文件。使用 cmd 进入 andro

24、id 工程的 bin 目录中,然后执行javah -classpath . -jni cc.androidos.jni.JNI 这个命令。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 18 页生成一个 cc_androidos_jni_JNI.h 里面都是 c 语言的头文件声明5. 书写 C 代码,写入数据下面使用 eclipse for c/c+ 进行开发。工程如下:cc_androidos_jni_JNI.h内容不变cc_androidos_jni_JNI.c的内容:精选学习资料 - - - - - - - - - 名师归纳总结

25、 - - - - - - -第 15 页,共 18 页在这里的代码会在运行的时候向sdcard 写入 androidos.cc.txt 文件。然后写入aaaa 数据。6. 编译 SO 文件进行编译 so 文件:在 NDK 的 apps 目录下面创建一个 myjni 文件夹,在 myjni 文件夹中创建一个Application.mk 文件,文件的内容为:在 NDKsources 目录下创建 myjni 文件夹,在 myjni 文件中创建一个Android.mk 文件,然后将 cc_androidos_jni_JNI.h 和 cc_androidos_jni_JNI.c 文件 copy 进来:精

26、选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 18 页Android.mk 中的内容如下:里面内容的关键字含义请自行查看docsOVERVIEW.TXT 文件编译:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 18 页7. 加入到 Android 工程中进行运行将 appsmyjnilibs 整个文件夹 copy 到 android 工程下:运行 android 工程使用 adb shell 进行查看:进入 sdcard 查看数据。注意: sdcard 具有 system 的权限,如果你的目录是 root 权限的,那么是不能写成功的,除非是真机越权,模拟器是不成功的,并且在 Eclipse logcat 下会有 DEBUG 信息出现。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 18 页

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号