• 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拷贝到TestNdkinclassescomexample estndk目录(这个是我的目录结构不同工程结构将不一致,请注意!),将cmd命令定位到TestNdkinclasses目录(注意是classes目录!不是.class所在目录),输入”javah com_example_testndk_JniClient“后回车,在TestNdkinclasses目录下就生成了C++头文件com_example_testndk_JniClient.h

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

    典型的CC++ 头文件

    四:编写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的方法)

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

  • 相关阅读:
    014-More than one file was found with OS independent path 'META-INF/DEPENDENCIES'
    013-一个Activity怎么调用另一个Activity的方法返回数据(转)
    012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)
    011-frament中不能调用getSystemService()方法
    010-Android开发解决控件超出屏幕,不能正常显示的问题
    009-在Fragment中实现Activity跳转功能
    Oracle分区表
    Oracle构造列
    Oracle集合
    Oracle多对多、维表
  • 原文地址:https://www.cnblogs.com/fengfenghuifei/p/6113252.html
Copyright © 2020-2023  润新知