Android NDK 初探,生成so文件以及调用so文件方法
因为最近业务上涉及安全的问题
然后有一些加密解密的方法和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文件方法的更多相关文章
- Java加载jar文件并调用jar文件当中有参数和返回值的方法
在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成 ...
- JavaScript文件中调用AngularJS内部方法或改变$scope变量
需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...
- Android NDK 学习之在C中调用Java的变量和静态变量
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- 基于 Android NDK 的学习之旅----- C调用Java
许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态 ...
- [android] 代码注册广播接收者&利用广播调用服务的方法
利用广播调用服务里面的方法,间接的方式调用服务内部的方法,与现实中差不多,请媒体曝光 主界面里面 在界面创建的时候开启一下服务普通的startService()方法 发送一条广播出去 获取Intent ...
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...
- C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...
- CUDA常见问题之无法在c文件中调用cu文件中定义的函数
当在C源文件中调用cu文件中定义的函数时,会出现undefined reference的问题,而在C++源文件中调用cu文件中定义的函数时则不会出现这个问题. 出现上述问题的原因是,nvcc编译器采用 ...
- as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试
private function callTest(event: Event): void{callExe("d:/a.exe");callBat("d:/a.bat&q ...
随机推荐
- (temp)catch ip
String str = "192.168.1.100"; String[] ipStr = str.split("\\."); ]; ; i < ; i ...
- h5动画效果总结
一些常用的h5效果,自己总结的,用的时候直接拿,方便快捷! 1.悬浮时放大: .one{transition:All 0.4s ease-in-out;-webkit-transition:All 0 ...
- Makefile编译库
funs.h: #ifndef __FUNS_H__ #define __FUNS_H__ void fun1(); #endif funs.c #include "funs.h" ...
- tomcat输出servlet-api.jar - jar not loaded 解决办法
tomcat输出servlet-api.jar - jar not loaded 解决办法 启动tomcat后,控制台输出信息:WEB-INF/lib/servlet-api.jar not load ...
- c++错误——intermediate.manifest : general error c1010070很傻的错
.\Debug\sadf.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manife ...
- [转]opencv3.0 鱼眼相机标定
[原文转自]:http://blog.csdn.net/qq_15947787/article/details/51441031 前两天发表的时候没注意,代码出了点错误,所以修改了一下,重新发上来. ...
- C# 将数字时间转化为特定格式字符串
在工作中,经常遇到,将距离某点的时间段转化为"HH:MM:SS"格式时间的情况. 经过总结,用C#实现了一个特别好的办法: DateTime _dTNow = DateTime. ...
- sql获取时间
SELECT CONVERT(varchar(10), getdate(), 120)--当前年月日,Example:2013-11-19 SELECT CONVERT(varchar(10), ge ...
- .dtsi .dts dtc dtb 是什么
基础 .dts: device tree source .dtsi: device tree source include .dts比作源文件,.dtsi比作头文件. dtc是linux源码 /s ...
- AngularJs开发环境搭建
1. 安装Sublime Text3 常用插件安装:AngularJs, Autoprefixer, BracketHighlighter,ConvertToUTF8,CSScomb,DocBlock ...