移动项目中JAVA与C/C++编解码相关的JNI动态库问题(.dll vs .so)
2013-10-17 23:04
411 查看
有一年没有写博了,最近搞了一个移动项目,大致情况是:编码算法安全起见采用C/C++,封装给ANDROID和J2EE WEB服务器使用,其中涉及AES/MD5/BASE64等算法的编解码若干。
WEB服务器这边,因为是WINDOWS环境,动态库是.dll文件;ANDROID那边,因为是LINUX环境,动态库是.so文件。
A. 先整.so动态库
1. 在ANDROID项目首先在JAVA程序中定义native class
2. 在class根目录下,通过javah命令,生成 XX.h头文件。
3. 在ANDROID项目的根目录下创建jni目录,Android.mk 、Application.mk文件参考NDK的样例;
4. 写好相关的算法,整合到 XX.cpp 中
5. 编译后在 libs\armeabi\lib-XX.so
6. ANDROID中java代码的LOAD调用方法:
static
{
System.loadLibrary("util-jni");
}
B. 继续整.dll动态库
1. 在JAVA项目的class根目录下,通过javah命令,生成 XX.h头文件
2. 在VC中创建一个WINDOWS工程/解决方案,选择DLL模式
3. 加入 JDK\include\jni.h; jni_md.h(或直接加到VC根目录下面的include文件夹下)
4. 导入商数NDK的.h和.cpp文件
5. 编译出Release版本的.dll文件
6. JAVA项目中的LOAD调用方法:
static
{
System.load("F:/workspace/test/libs/XX.dll");//完整路径
}
注意事项:
a。ANDROID NDK项目的JNI写法相对比较宽松,不需要有对于的头文件,也不需要再方法中添加JNIEXPORT jTYPE JNICALL,DLL动态库项目必须要加上这段
b。JAVA、ANDROID有现成的AES等编码实现,C/C++需要找开源的,但是前者实现比较规范,后者相对比较苦逼,高地位、16位补全等问题,非常的坑爹,所以建议大家在跨平台的工具类中,建议通过C/C++来封装动态库,实现跨平台调用。
遇到的几个问题:
a。VC中AES与NDK中的AES,同样的算法编码结果不一样,会自动按16位补位,KEY改成16位,编码结果一样。
B。NDK的AES与ANDROID中的编码结果不一样,AES算法(Advanced Encryption Standard,高级加密标准)包括加密算法、工作模式、填充方式,不满16位补位等,最主要的是一般的C/C++的算法都只实现了加密算法和工作模式,对于填充方式没有开放,有个朋友讲Botan实现了,没有考证。
最后建议采用LINUX内核的服务器,呵呵
WEB服务器这边,因为是WINDOWS环境,动态库是.dll文件;ANDROID那边,因为是LINUX环境,动态库是.so文件。
A. 先整.so动态库
1. 在ANDROID项目首先在JAVA程序中定义native class
2. 在class根目录下,通过javah命令,生成 XX.h头文件。
3. 在ANDROID项目的根目录下创建jni目录,Android.mk 、Application.mk文件参考NDK的样例;
4. 写好相关的算法,整合到 XX.cpp 中
5. 编译后在 libs\armeabi\lib-XX.so
6. ANDROID中java代码的LOAD调用方法:
static
{
System.loadLibrary("util-jni");
}
B. 继续整.dll动态库
1. 在JAVA项目的class根目录下,通过javah命令,生成 XX.h头文件
2. 在VC中创建一个WINDOWS工程/解决方案,选择DLL模式
3. 加入 JDK\include\jni.h; jni_md.h(或直接加到VC根目录下面的include文件夹下)
4. 导入商数NDK的.h和.cpp文件
5. 编译出Release版本的.dll文件
6. JAVA项目中的LOAD调用方法:
static
{
System.load("F:/workspace/test/libs/XX.dll");//完整路径
}
注意事项:
a。ANDROID NDK项目的JNI写法相对比较宽松,不需要有对于的头文件,也不需要再方法中添加JNIEXPORT jTYPE JNICALL,DLL动态库项目必须要加上这段
b。JAVA、ANDROID有现成的AES等编码实现,C/C++需要找开源的,但是前者实现比较规范,后者相对比较苦逼,高地位、16位补全等问题,非常的坑爹,所以建议大家在跨平台的工具类中,建议通过C/C++来封装动态库,实现跨平台调用。
遇到的几个问题:
a。VC中AES与NDK中的AES,同样的算法编码结果不一样,会自动按16位补位,KEY改成16位,编码结果一样。
B。NDK的AES与ANDROID中的编码结果不一样,AES算法(Advanced Encryption Standard,高级加密标准)包括加密算法、工作模式、填充方式,不满16位补位等,最主要的是一般的C/C++的算法都只实现了加密算法和工作模式,对于填充方式没有开放,有个朋友讲Botan实现了,没有考证。
最后建议采用LINUX内核的服务器,呵呵
相关文章推荐
- C/C++/C#问题记录(一)VS2012编译调用dll项目找不到lib的workaround
- Java使用JNI调用C/C++的DLL动态链接库1
- Java之—— JAVA Web项目中DLL/SO文件动态加载方法
- java如何调用dll:用JNI调用C或C++动态联接库原来如此简单
- 【转载整理】eclipse 开发c/c++、Java使用JNI调用C程序、生成64位dll动态链接库
- java用jni调用dll动态库出现Can't find dependent libraries问题的解决方法
- java项目配置dll,so动态库文件方式
- Java使用JNI调用C/C++的DLL动态链接库2
- Java JNI 调用C/C++ 本地库(dll/so)
- JNI java 调c++动态库函数,多值回传及乱码问题
- 遭遇 VS 的 无法调试引用的类库项目(DLL)问题(生成下面的模块时,启用了优化或没有调试信息)
- 解决vs2005新建C++移动项目时脚本错误的问题
- VB6.0软件调用VS C++ DLL问题解决
- 关于VS.NET中多个项目的工程相互引用和多个dll引用的问题!
- C#调用C++ DLL相关问题
- 遭遇 VS 的 无法调试引用的类库项目(DLL)问题(生成下面的模块时,启用了优化或没有调试信息)
- 关于Android使用JNI报错 java.lang.UnsatisfiedLinkError: dlopen failed: 和xxx.so: has text relocations错误问题的解决
- [总结]关于VS2002下的项目迁移到VS2005下相关问题总结
- android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题
- [2014.1.31] Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)