android中使用jni调用本地C++库

android平台上的本地库文件后缀 .so。类似windows上的dll文件。

要在android上使用jni。首先须要下载android ndk。

操作步骤,正常建立androidproject,然后在androidproject那里右键。属性,选择Android Tools -> Add Native Support。就能够为androidproject添加本地库支持。

加入支持后的androidproject,会添加jni文件夹,C++代码就写在这个文件夹里。

新建一个类。而且使用native修饰一个函数。这个函数就是须要本地库来实现的。本样例中的本地库函数作用是将字符串进行内置算法转换,server可依据这个转换识别client的合法性,使用jni的目的是添加代码反编译破解的复杂度。

package com.show.shownative.lib;

public class ShowNativeLib {
public native String showConvertCode(String param);
}

使用javah生成头文件:ShowNativeLib.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_show_shownative_lib_ShowNativeLib */ #ifndef _Included_com_show_shownative_lib_ShowNativeLib
#define _Included_com_show_shownative_lib_ShowNativeLib
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_show_shownative_lib_ShowNativeLib
* Method: showConvertCode
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_show_shownative_lib_ShowNativeLib_showConvertCode
(JNIEnv *, jobject, jstring); #ifdef __cplusplus
}
#endif
#endif

在android的nativeproject设置中须要 mk文件类进行编译配置。

本样例中须要用到三个MK ,系统会为你自己主动创建一个,照着路径新建两个就能够了

1、Application.mk 内容例如以下

APP_STL := stlport_static
APP_ABI := armeabi armeabi-v7a mips x86

以上两行配置说明:第一个是添加C++ STL模版支持。第二个是设置须要为哪几种CPU架构编译so文件。

2、Android.mk 内容例如以下

LOCAL_PATH := $(call my-dir)

include $(LOCAL_PATH)/ShowNativeLib.mk

以上的配置,第一行是死的。

第二行是一个多模块引入方式。假设你还有其它本地库模块,能够分模块。这里include即可了。

3、ShowNativeLib.mk 内容例如以下

include $(CLEAR_VARS)

LOCAL_MODULE    := ShowNativeLib
LOCAL_SRC_FILES := ShowMD5.cpp ShowNativeLib.cpp include $(BUILD_SHARED_LIBRARY)

这个文件才是我们样例里面測试的这个模块的配置。

ShowNativeLib.cpp 就是我们的实现文件,ShowMD5.cpp是一个第三方MD5摘要算法开源库。(这里得吐槽一下,MD5。SHA1这样的都叫摘要算法(DIGEST)。由于发现非常多人都没搞懂而喊它加密算法。

当中ShowNativeLib.cpp的代码实现例如以下:解释都在代码里。

#include <jni.h>
#include <stddef.h>
#include <stdlib.h>
#include <ShowMD5.h>
#include <ShowNativeLib.h> #define CONVERT_KEY ("sobey_showfun_convert_key_47511441331441") JNIEXPORT jstring JNICALL Java_com_show_shownative_lib_ShowNativeLib_showConvertCode(JNIEnv* pEnv, jobject obj, jstring param)
{
if(!param)
return NULL ; /*
* JNI里面操作java对象的方式,全都是基于java反射机制来做的。
* 假设你全然没接触过java反射。那么你先应该去查查java反射的资料。
* 以下仅仅做基本解释。不做深入讨论。
*/ //取得java.lang.String的class
jclass clzString = pEnv->FindClass("java/lang/String");
//取得String.getBytes的函数的Method对象
jmethodID getMethod = pEnv->GetMethodID(clzString,"getBytes","()[B");
//运行这个Method。得到String.getBytes返回的字节数组。
jobject byteObj = pEnv->CallObjectMethod(param, getMethod);
jbyteArray paramBytes = (jbyteArray)byteObj ;
//将java的byte[]转成C++的 unsigned char*。 以进行后面的转换算法。 unsigned char* pBufIn = (unsigned char*)pEnv->GetByteArrayElements(paramBytes,NULL);
jsize paramByteLen = pEnv->GetArrayLength(paramBytes); //调用MD5库,进行摘要处理。
std::string paramMd5 = GetMD5Code(pBufIn, (int)paramByteLen);
int lengthMd5 = paramMd5.size(); //将内置的转换key,进行MD5处理
std::string paramKey = GetMD5Code((unsigned char*)CONVERT_KEY,strlen(CONVERT_KEY)); //进行转换算法。
for(int idx=0; idx<lengthMd5; idx++)
{
paramMd5[idx] ^= paramKey[idx];
paramMd5[idx] |= 0x31 ;
} //将结果MD5二进制数据,转化成16进制表示的字符串
std::string resultMD5 = GetMD5Code((unsigned char*)paramMd5.c_str(),paramMd5.size()); //将C++字符串转化成java字符串。 jstring result = pEnv->NewStringUTF(resultMD5.c_str()); return result ;
}

以上就是android里面使用JNI的样例。

jni还是非常有帮助的,android的java毕竟在效率上有瓶颈(解释性语言的虚拟机,多了一个解释层),非常多须要高效率的数据处理。还是免不了要调用本地库来处理。

苹果ios和android机比起来。从技术角度来看,人家的objc语言和ios平台。就比android平台的java运行效率高,这是不争的事实。

所以相同的硬件配置,苹果机跑起来的流畅度是android机比不了的。但让实际情况是android机的硬件配置高得令人抓狂。

编程基础知识——Java JNI开发流程(2)的更多相关文章

  1. SHELL脚本编程基础知识

    SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...

  2. 一、Android NDK编程预备之Java jni简介

    转自:  http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖     论坛›eoe·Android应用开发区›Androi ...

  3. 16第一章 ASP.Net编程基础知识

    第一章        ASP.Net编程基础知识 第一章        ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...

  4. JNI开发流程-JNI/NDK【转】

    本文转载自:http://wiki.jikexueyuan.com/project/jni-ndk-developer-guide/workflow.html 开发流程 JNI 全称是 Java Na ...

  5. JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/41777471 JNI全称是Java Native Interface(Java本地接口)单 ...

  6. C#网络编程基础知识

    C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...

  7. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

  8. 二、Android NDK编程预备之Java jni入门Hello World

    转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...

  9. TCP与UDP比较 以及并发编程基础知识

    一.tcp比udp真正可靠地原因 1.为什么tcp比udp传输可靠地原因: 我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程 ...

随机推荐

  1. 批处理 更新 svn git hg

    @echo off Setlocal enabledelayedexpansion ::CODER BY Administrator POWERD BY iBAT 1.6 ::设置svn默认安装位置以 ...

  2. es6(三set和map数据结构)

    es6中提供了一个新的数据结构Set,他有点类似数组,但和数组不同的是,在里面你如果写入重复的值的话,他不会显示重复值. const s =new Set(); [2,3,4,5,6,6,6,7,8, ...

  3. 暴力破解UltraEdit

    使用x32dbg(x64dbg)做为破解工具: 使用x64dbg 打开 udeit64.exe 点击运行,直到UltraEdit启动,转到符号页: 找到: CheckForUpdatesNoPromp ...

  4. [JOYOI] 1096 数字组合

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  5. Django框架基础知识12-中间件及上下文处理器

    Django中间件(Middleware) 是一个轻量级.底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. django 中的中间件(middleware) ...

  6. 剑指Offer(书):矩阵中的路径

    题目: * 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.* 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.* 如果一条路径经 ...

  7. Android开发——常用ADB命令的使用

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它的功能如下: 运行设备的sh ...

  8. 【瞎扯】我的OI之路

    这里大概是一些我自己对我的OI之路的一些记录. 2015.11不知道哪一天-- 我听说了"编程". 当时还不懂得啥是信息学竞赛,以为这只是纯粹的程序设计.后来才明白信息学竞赛是算法 ...

  9. luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers

    先满足挑剔的 #include <algorithm> #include <iostream> #include <cstdlib> #include <cs ...

  10. jquery select 常用操作总结

    由于在项目各种所需,经常碰到select不种操作的要求,今天特意总结了一下,分享: jQuery获取Select选择的Text和Value: 语法解释: 1. $("#select_id&q ...