因为最近业务上涉及安全的问题

然后有一些加密解密的方法和key的存储问题

本来想存储到手机里面,但是网上说一般敏感信息不要存储到手机Sdcard上

而且我这个如果从网络建立通信获取的话,又太耗时,所以黑客论坛上就有人建议把加密解密的关键信息写在so里,然后从so里面调用

要想破解so就涉及到汇编语言的,这个没功力的话一般做不成的 O(∩_∩)O

在此感谢作者

原博文:http://www.cnblogs.com/yejiurui/p/3476565.html  作者:Andye

大体流程

1:建立一个编译jni用的builder

2:写java Client native 方法

3:生成.h文件

4:编写Android.mk和 .c文件

5:clean工程生成so文件,调用so内方法  

下面步入正题(Eclipse平台):

准备:在工程下建立一个jni文件夹

一:建立一个编译jni用的Builder

在工程的properties里new一个Builder

名字可以随便写,然后选择ndk中ndk_build.cmd文件的位置;第二个为工程位置

Environment可以不用设置其余按照图示设置,之后点击Specify Resources

选择准备里面建立的jni文件夹,至此第一步完成

二:写java Client native 方法

新建一个JniClient类重要的是方法前缀! static public native !

注:这里最好不要写中文字符,否则会造成后面步骤编译.h文件出错,我这里出错了 (⊙o⊙)说是编码GBK的不可映射字符

三:生成.h文件

用cmd命令定位到(命令 cd xxx)刚才写的JniClient.java的目录 然后输入“javac JniClient.java” 回车

成功了就可以看到一个class文件

之后再将JniClinet.class拷贝到TestNdk\bin\classes\com\example\testndk目录(这个是我的目录结构不同工程结构将不一致,请注意!),将cmd命令定位到TestNdk\bin\classes目录(注意是classes目录!不是.class所在目录),输入”javah com_example_testndk_JniClient“后回车,在TestNdk\bin\classes目录下就生成了C++头文件com_example_testndk_JniClient.h

打开后.h文件 函数名声明如下图所示

典型的C\C++ 头文件

四:编写Android.mk和 .c文件

在jni文件夹下 建一个mk文件 后面.h和.c文件也要放进去

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestNdk
LOCAL_SRC_FILES := com_example_testndk_JniClient.c
include $(BUILD_SHARED_LIBRARY)

注意mk写的时候 第4句为.c文件的文件名

第三句为工程名 ;

.c文件 方法的实现(这个基本是要自己写的一个地方)

#include "com_example_testndk_JniClient.h"
#include <stdlib.h>
#include <stdio.h> #ifdef __cplusplus
extern "C"
{
#endif
/*
* Class: com_example_testndk_JniClient
* Method: AddStr
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_testndk_JniClient_AddStr
(JNIEnv *env, jclass arg, jstring instringA, jstring instringB)
{
jstring str = (*env)->NewStringUTF(env, "HelloWorld from JNI !");
return str;
} /*
* Class: com_example_testndk_JniClient
* Method: AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_testndk_JniClient_AddInt
(JNIEnv *env, jclass arg, jint a, jint b)
{
return a + b;
} #ifdef __cplusplus
}
#endif

这里原作者是只是返回了一个字符串并没有对String字符串进行连接操作,哈哈 只是为了演示so文件的大体流程嘛,具体实现自己可以用C写

五: clean工程生成so文件,调用so内方法

将.h .c 和Android.mk放在jni目录下

当编辑com_ndk_test_JniClient.c并保存后,project下的—clean  一下工程,就可以看到TestNkd工程下的obj/local/armeabi目录下将自动生成libTestNdk.so库。

番外正片:调用so中方法

例子:将调用so中的AddStr方法(其实调用JniClient的方法)

这样就完成了 (*^__^*)

Android NDK 初探,生成so文件以及调用so文件方法的更多相关文章

  1. Java加载jar文件并调用jar文件当中有参数和返回值的方法

    在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成 ...

  2. JavaScript文件中调用AngularJS内部方法或改变$scope变量

    需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...

  3. Android NDK 学习之在C中调用Java的变量和静态变量

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  4. 基于 Android NDK 的学习之旅----- C调用Java

    许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态 ...

  5. [android] 代码注册广播接收者&利用广播调用服务的方法

    利用广播调用服务里面的方法,间接的方式调用服务内部的方法,与现实中差不多,请媒体曝光 主界面里面 在界面创建的时候开启一下服务普通的startService()方法 发送一条广播出去 获取Intent ...

  6. C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件

    比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...

  7. C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件

    比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...

  8. CUDA常见问题之无法在c文件中调用cu文件中定义的函数

    当在C源文件中调用cu文件中定义的函数时,会出现undefined reference的问题,而在C++源文件中调用cu文件中定义的函数时则不会出现这个问题. 出现上述问题的原因是,nvcc编译器采用 ...

  9. as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试

    private function callTest(event: Event): void{callExe("d:/a.exe");callBat("d:/a.bat&q ...

随机推荐

  1. 用js写的极简的导航菜单,带下拉列表

    太简单了,不多说,但是自己还是写了一会,因为总会出现这样那样小的错误,毕境最近在复习和学习一些前台,欢迎看到的各位能给点改进意见或者其它的,Thank you! 首先是发图,只用CSS写了结构,几乎没 ...

  2. Java 导入Excel文件到数据库

    原文:http://www.jb51.net/article/44021.htm 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两 ...

  3. mac_snailSVN

    作者:潘捷链接:https://www.zhihu.com/question/19705164/answer/119484169来源:知乎著作权归作者所有,转载请联系作者获得授权. Mac下之前也有类 ...

  4. OC-内存管理

    解铃还须系铃人 --1--内存管理的原理及分类 1.1 内存管理的原理 1.2 内存管理的分类 --2--手动内存管理 2.1 关闭ARC的方法 2.2 手动管理(MRC)快速入门 --3-- 内存管 ...

  5. Program.cs

    Program.cs using System; namespace HelloWorld { class Program { [STAThread] static void Main(string[ ...

  6. linux下给网卡加VLAN标签和私网地址

    1.加载8021q协议 moprobe 8021q 2.安装必要的包 yum -y groupinstall base linux 3.添加私网地址(写到开机启动项) vconfig add bond ...

  7. JavascriptExecutor

    Why we use it?To enhance the capabilities of the existing scripts by performing javascript injection ...

  8. 7.dotnet core 如何发邮件

    需要用到的Nuget包 "MailKit": "1.8.1", 方法 /// <summary> /// 发送邮件(支持Html发送,支持添加一个附 ...

  9. 双十一 VS 火车票(12306)

    火车票开售了,又是一年,code了一年,咱们也该回顾回顾了. 还记得12306上线之初各种技术大牛给人家出方案,吐槽人家外包费用?我们来回顾回顾. 就园子里都过千篇文章来侃这事儿,请问有多少主题的文章 ...

  10. EX14 彩票中奖 (lottery.pas/c/cpp)

    [题目描述]小明想试试运气去购买彩票,所以他开始研究彩票大乐透的玩法:超级大乐透是指由购买者从01—35共35个号码中选取5个号码为前区号码,并从01—12共12个号码中选取2个号码为后区号码组合为一 ...