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

然后有一些加密解密的方法和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

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := TestNdk
  4. LOCAL_SRC_FILES := com_example_testndk_JniClient.c
  5. include $(BUILD_SHARED_LIBRARY)

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

第三句为工程名 ;

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

  1. #include "com_example_testndk_JniClient.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. #ifdef __cplusplus
  6. extern "C"
  7. {
  8. #endif
  9. /*
  10. * Class: com_example_testndk_JniClient
  11. * Method: AddStr
  12. * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
  13. */
  14. JNIEXPORT jstring JNICALL Java_com_example_testndk_JniClient_AddStr
  15. (JNIEnv *env, jclass arg, jstring instringA, jstring instringB)
  16. {
  17. jstring str = (*env)->NewStringUTF(env, "HelloWorld from JNI !");
  18. return str;
  19. }
  20.  
  21. /*
  22. * Class: com_example_testndk_JniClient
  23. * Method: AddInt
  24. * Signature: (II)I
  25. */
  26. JNIEXPORT jint JNICALL Java_com_example_testndk_JniClient_AddInt
  27. (JNIEnv *env, jclass arg, jint a, jint b)
  28. {
  29. return a + b;
  30. }
  31.  
  32. #ifdef __cplusplus
  33. }
  34. #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. html5与html4的区别,如何一眼区分

    还是在面试过程中遇到的这个问题,但是当时感觉回答的不是很全面,回来以后自己做的总结: 以上这个问题如果教大家看源码,可能一眼很直观的就能认出,那个是html4,那个是html5,但是面试的时候问道这个 ...

  2. sharepont 2013 隐藏Ribbon 菜单

    引用:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.Web.Comma ...

  3. java第六次作业

    一个抽奖程序:用ArrayList类和random类 import java.awt.*; import javax.swing.*; import java.awt.event.; import j ...

  4. Redis的Replication(复制)

    文件并发(日志处理)--队列--Redis+Log4Net 分布式中使用Redis实现Session共享(二) http://www.cnblogs.com/stephen-liu74/archive ...

  5. s3c2440液晶屏驱动 (内核自带) linux-4.1.24

    自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev ...

  6. Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用

    Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...

  7. pt-online-schema-change原理解析

    都说pt-toolkit工具集中的pt-online-schema-change可以在线不锁表修改表结构,那么这个工具具体是什么原理呢,请见下面娓娓道来: 1.pt-online-schema-cha ...

  8. sql获取时间

    SELECT CONVERT(varchar(10), getdate(), 120)--当前年月日,Example:2013-11-19 SELECT CONVERT(varchar(10), ge ...

  9. filter(滤镜) 属性 内部资料 请勿转载 谢谢合作

    Filter 描述 none 默认值,没有效果. blur(px) 给图像设置高斯模糊."radius"一值设定高斯函数的标准差,或者是屏幕上以多少像素融在一起, 所以值越大越模糊 ...

  10. Web App适配不同屏幕的几点建议

    安卓设备在屏幕尺寸和像素密度上差别很大,因此在使用WebView加载网页时就需要考虑到这种差别,对我们的网页做出精心的设计以在不同的屏幕上都能得到合适的展现.通常情况下,我们需要考虑到两个因素:1.视 ...