如何在android上支持JNA 实战步骤
来源:互联网 发布:ncbi sra数据怎么下载 编辑:程序博客网 时间:2024/05/04 11:04
最近正好有一个项目需要从java层利用jna调用底层H323通信栈,尝试了一把将jna加到android上支持。如下:
1) 首先 JNA存在形式只是一个jna.jar 结构为java class + platform native lib(libjnidispatch.so),现在支持的平台有win32 x86/amd64/mac, linux x86/bsd, sun os 等等,java层应该是通用,无需做改动。所以文章就做在怎样得到android平台辨认的native .so 上。
2) 确定思路,搭建jna/native arm交叉编译环境,得到android自己的jna.jar.
3) 源码下载,开源项目非常方便
$ svn co https://jna.dev.java.net/svn/jna/trunk/jnalib
4) 选择编译器,考虑到jna是gnu项目,而且所有eabi编译器都兼容,所以选择arm-linux-none-gnueabi-gcc.
5) 进入源码树,
$ cd jnalib
6) 设置环境变量。java, gcc, ant等。
$ export PATH=/opt/ant/bin:/opt/jdk1.6.0_11/bin:/opt/arm-none-linux-gnueabi/bin:/opt/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin:$PATH
$ export JAVA_HOME=/usr/java/jdk1.6.0_21/
7) 更改build.xml,native/makefile来支持arm平台。(比较长,可略过不看)
ndex: native/Makefile
===================================================================
--- native/Makefile (revision 1146)
+++ native/Makefile (working copy)
@@ -54,8 +54,8 @@
LIBSFX=.so
ARSFX=.a
JNISFX=$(LIBSFX)
-CC=gcc
-LD=gcc
+CC=arm-none-linux-gnueabi-gcc
+LD=arm-none-linux-gnueabi-gcc
LIBS=
# Default to Sun recommendations for JNI compilation
COPT=-O2 -fno-omit-frame-pointer -fno-strict-aliasing
@@ -126,10 +126,12 @@
endif
ifeq ($(OS),linux)
-ARCH=$(shell uname -m | sed 's/i.86/i386/g')
+ARCH=arm #$(shell uname -m | sed 's/i.86/i386/g')
PCFLAGS+=-fPIC
CDEFINES+=-DHAVE_PROTECTION
LDFLAGS+=-Wl,-soname,$@
+FFI_CONFIG += --host=arm-none-linux-gnueabi
+CINCLUDES+=-I/usr/include
endif
ifeq ($(OS),freebsd)
Index: build.xml
===================================================================
--- build.xml (revision 1146)
+++ build.xml (working copy)
@@ -92,6 +92,7 @@
<os arch="ppc64"/>
<os arch="sparcv9"/>
<os arch="amd64"/>
+ <os arch="arm"/>
</or>
</condition>
<condition property="ld.preload" value="LD_PRELOAD_64" else="LD_PRELOAD">
@@ -110,6 +111,9 @@
<condition property="jre.arch" value="i386">
<equals arg1="x86" arg2="${os.arch}"/>
</condition>
+ <condition property="jre.arch" value="arm">
+ <equals arg1="arm" arg2="${os.arch}"/>
+ </condition>
<condition property="jre.arch" value="amd64">
<equals arg1="x86_64" arg2="${os.arch}"/>
</condition>
@@ -285,6 +289,7 @@
<copy file="${dist}/out-of-date.jar" tofile="${dist}/win32-x86.jar" overwrite="true"/>
<copy file="${dist}/out-of-date.jar" tofile="${dist}/win32-amd64.jar" overwrite="true"/>
<copy file="${dist}/out-of-date.jar" tofile="${dist}/linux-i386.jar" overwrite="true"/>
+ <copy file="${dist}/out-of-date.jar" tofile="${dist}/android.jar" overwrite="true"/>
<copy file="${dist}/out-of-date.jar" tofile="${dist}/linux-amd64.jar" overwrite="true"/>
<copy file="${dist}/out-of-date.jar" tofile="${dist}/linux-ia64.jar" overwrite="true"/>
<copy file="${dist}/out-of-date.jar" tofile="${dist}/freebsd-i386.jar" overwrite="true"/>
@@ -598,6 +603,9 @@
<zipfileset src="${dist}/linux-i386.jar"
includes="*jnidispatch*"
prefix="com/sun/jna/linux-i386"/>
+ <zipfileset src="${dist}/arm-none-linux.jar"
+ includes="*jnidispatch*"
+ prefix="com/sun/jna/android"/>
<zipfileset src="${dist}/linux-amd64.jar"
includes="*jnidispatch*"
prefix="com/sun/jna/linux-amd64"/>
8) 编译
$ ant -Djre.arch=arm -Dos.arch=arm -Dos.prefix=linux-arm
9)编译完成,你就可以在build下等到arm编译器编出来的jna.jar了, 如果你用eclipse,就可以直接Project...->add Jar 使用它了。有可能(还不确定), android不支持在jar包中加本地native .so 的做法,你可以将jna.jar分拆开将java class还以Jar的方式加载,而把linux-arm/下的libjnidispatch.so以add Lib..的方法加入,你可以尝试一下。
转载请注明出处和作者,谢谢。
- 如何在android上支持JNA 实战步骤
- 如何在android上支持JNA
- 如何在android上支持JNA 知识准备
- JNA移植到android上
- Android开发如何使用JNA
- jna实战
- 如何在IIS上支持FLV
- Ionic在Android上部署app步骤
- Android JNA
- 如何在LINUX VPS上安装VPN详细步骤
- JNA 之 初识(上)
- JNA 之 初识(上)
- 实战:如何在Linux上安装与配置Hadoop
- 【深夜记坑】在android中使用JNA
- 如何在apache服务器上配置ssl以支持https
- 如何在ubuntu 上支持思科的vpn
- 如何在Xcode5 上创建支持iOS5.0的工程
- 如何在Xcode5 上创建支持iOS5.0的工程
- 044_《Delphi程序设计基础教程》
- php三级联动菜单
- 敏捷技巧:什么时候以什么方式来进行代码评审
- WinAPI: OffsetWindowOrgEx - 移动窗口坐标原点
- 迷茫中,好像丟失了自己
- 如何在android上支持JNA 实战步骤
- Observable
- Zen Cart模板修改常用文件说明
- GTK Gossip: 事件遮罩(Event Mask)
- Intel AVX 指令集对视频处理的影响
- Squid中的日志出现TCP_CLIENT_REFRESH_MISS的问题排除
- 使用Hibernate时,向数据库插入默认值的实现
- Adobe flex的平台差异
- [squid] 对大文件中的 range_offset_limit 和 quick_abort_min 的使用和多个回源的解决