如何在android上支持JNA 实战步骤

最近正好有一个项目需要从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 @@
        
        
        
+       
      
    
    
@@ -110,6 +111,9 @@
    
      
    

+   
+     
+   

    
      
    

@@ -285,6 +289,7 @@
    
    
    
+   
    
    
    
@@ -598,6 +603,9 @@
                          includes="*jnidispatch*"
                   prefix="com/sun/jna/linux-i386"/>
+      +                  includes="*jnidispatch*"
+                  prefix="com/sun/jna/android"/>
                          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 实战步骤)