Android Studio 通过JNA调用 Clang编译的so库,以及Java JNA 调用x64dll,C# dllimport调用x86dll

这篇博客介绍了如何在Android Studio项目中利用JNA调用由Clang编译的SO库,并探讨了Java通过JNA调用x64 DLL以及C#使用DllImport调用x86 DLL的方法,展示了跨平台的接口调用实践。
摘要由CSDN通过智能技术生成
这是我第一次写blog,如果有写的不好的地方请大家指正.
转载请注明出处,尊重我花了大半个月时间的学习成果
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个 java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

优点

JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。  JNA最大的好处是避免了重复造轮子的浪费时间的行为.
 用过JNI的大神都知道,JNI是一种很变态的设计,JNI需要导入专门为Java生成的头文件,是一种侵入式的设计,这样被强行改造的源码编译的dll将不能被C#调用

JNA描述

JNA类库使用一个很小的本地类库sub 动态的调用 本地代码。程序员只需要使用一个特定的 java接口描述一下将要调用的本地代码的方法的结构和一些基本属性。这样就省了为了适配多个平台而大量的配置和编译代码。因为调用的都是JNA提供的公用jar 包中的接口。

目标

编辑
JNA是为了程序员调用本地代码更方便,跑的更快以及减少出错。

JNA的使用:
好了废话不多说,下面开始介绍JNA怎么样,并且以一个有实际意义的Ecc椭圆曲线加密算法作为介绍的例子,而不是
以经典的Hello world,大家可以按照步骤,生成一个hello world类库.
大家都知道Android一般都是作为客户端,服务器端都是PC机,
Ecc椭圆曲线不对称加密算法一般是用来加密 对称密钥
然后把对称密钥通过网络安全的传输给对方, 密文只能用私钥解密,
只要保证了私钥的安全性也就保证了 对称密钥的安全
这里我先以Windows平台为例,在PC端先实现Ecc加密算法,之后再介绍在Android中使用Ecc.so库
     最少所需的开发工具是 Android Studio 2.0, Visual Studio 2015, Eclipse mars版,
      建议使用vs2010生成windows平台的dll文件.
1.首先下载 开源的JNA框架  链接已经提供好了 拿好不谢 链接:http://pan.baidu.com/s/1bpJrrJL 密码:ygod
2. 第二步开始为Windows 7 x64平台编译 ecc.dll加密算法,
我安装的Java JDK是 1.8 x64 我使用的编译器的 vs2010,
不要使用visual studio 2010 以上版本,以及 codeblocks和Dev 等编译器,
不然到时候你会调用dll的时候 有好多坑等着你.

      Tips:
      如果你没有安装visual studio 2010,只安装了vs2015,而且实在不想再去安装vs2010.
       这里有个解决的办法,那就是使用静态编译,之前visual studio 各版本默认都是动态编译
       依赖的运行库都是在系统目录中的dll,如果编译出来的应用程序可以在开发者的电脑中运行,
       那么依赖的运行库可以在 C:\Windows\System32 或者 C:\Windows\SysWOW64 中找到
       高版本的visual studio动态编译可能带来一个问题,在别人电脑中就不能正常运行了.
       只需要设置静态编译,一般就能在别人的电脑中正常运行了.如果大家设置了无效,那还是
       使用低版本的vs开发工具吧.静态编译也有不好的地方,那就是生成的exe或者dll文件相比于
       原来的动态编译大好几倍,这不利于网络传输,并且整个项目编译期间产生的的其他文件都会
       相当大.非常占电脑的硬盘空间.所以建议能不用静态编译还是不用为好.

       只需要把运行库的选项从 /MDd 改成 /MTd 就行了.
       静态编译怎么设置如下图所示:
      

      接下来在项目的属性页中设置 C/C++ -> 预编译头 -> 不使用预编译头
因为我的代码中使用tommath是C语言数学函数库,ecc加密部分是C++代码,不这样设置会编译失败的
然后编译的时候分别为x86和x64平台编译32位和64位dll文件
至于为什么这么做  因为 Java JDK 1.8 x64  JNA调用DLL只认识 64位的 ecc.dll文件
而 C# 中Dllimport特性调用ecc.dll 只认识 32位的dll,这就尴尬了 不得不为C#和Java JNA生成不同的dll
在vs2010中怎么生成x86和x64的动态链接库如下图
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值