如何在android上支持JNA

转载 2012年03月22日 10:10:49

转载:http://jessyshen.blog.sohu.com/159782254.html最近正好有一个项目需要从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..的方法加入,你可以尝试一下。


转自 http://blog.chinaunix.net/uid-8210028-id-1758656.html

如何在android上支持JNA 知识准备

JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.    相比于jni,jna的优势有如下两点:    1)使...
  • jessyshen917
  • jessyshen917
  • 2010年12月08日 13:46
  • 1711

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

最近正好有一个项目需要从java层利用jna调用底层H323通信栈,尝试了一把将jna加到android上支持。如下:    1) 首先 JNA存在形式只是一个jna.jar 结构为java clas...
  • jessyshen917
  • jessyshen917
  • 2010年12月09日 09:18
  • 2968

Android JNA

Add Android SDK/NDK tools into PATH (used by native/Makefile).Set environment variable NDK_PLATFORM ...
  • feng88724
  • feng88724
  • 2013年10月14日 18:57
  • 3469

【JNA探索之路系列】之一:JNA开篇

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年07月12日 14:12
  • 1527

JNA调用DLL一点小结

JNA调用DLL一点小结 声明:发表在其他博客的原创文章,会陆续转过来。   前段时间碰到一客户需要在JAVA语言中调用C++编写的DLL,感觉操作很不方便。于是上网搜索,搜到...
  • u010477502
  • u010477502
  • 2016年01月26日 00:39
  • 1088

JNA调用32dll和64位dll的兼容解决

最近在学习jna,发现dll文件能能否成功调用取决于jdk位数。而且有个情况是位数不对应的话报的错是 "Exception in thread "main" java.lang.Unsatisfie...
  • u014095729
  • u014095729
  • 2016年01月25日 14:25
  • 3274

Android Studio里使用JNA

教程二 在Android Studio里使用JNA环境 Android Studio 1.5.1 已经下载内置ndk 具体操作 准备JNA开发环境这个部分是最重要的,也是与JNI的例子主要不同之处之一...
  • sadcup
  • sadcup
  • 2015年12月23日 13:41
  • 1976

在Android Studio进行测试

在Eclipse里面测试很麻烦,又要新建一个项目,又要在mianfest文件添加测试框架和依赖库。 现在在android studio里面要测试就不用那么麻烦,要是你是一开始就是在AS新建的工程,它...
  • rentalphang
  • rentalphang
  • 2016年05月26日 23:20
  • 117

如何在android上运行c程序

    这两天终于可以在android上运行c程序了,也可以勉强交差了。和大家分享一下,共同学习!准备工作:    1 下载cygwin(windows上模拟UNIX环境),设置bin目录的环境变量。...
  • zsoftdevelop
  • zsoftdevelop
  • 2011年05月25日 12:09
  • 2183

Android开发如何使用JNA

在非安卓的平台上,一般我们直接使用这两个 jar 包就可以轻松使用 JNA 并进行安卓开发了。在安卓上由于这两个 jar 包默认没有对应安卓版本的 libjnidispatch.so 文件,因此我们需...
  • JAZZSOLDIER
  • JAZZSOLDIER
  • 2017年08月07日 19:48
  • 1056
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在android上支持JNA
举报原因:
原因补充:

(最多只允许输入30个字)