这是我第一次写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类库使用一个很小的本地类库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文件.
最少所需的开发工具是 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++ -> 预编译头 -> 不使用预编译头
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的动态链接库如下图