一.Java反射机制
先了解Java反射机制原理


例子网上很多,反射很灵活


二. 在JNI层调Java
用途: Java层逆向比较容易,增加逆向门槛,把调用都写到JNI层,  让Java层无调用关系
注意: C和C++有所不同,这里使用C++作为例子

1. 首先在代码中提供一个ShowLog函数
private void ShowMsg() {
    Log.d("_BING_", "ShowMsg");

}  


2. 在上次的Add例子加入代码
JNIEXPORT jint JNICALL Java_org_bing_testjni_MainActivity_Add
  (JNIEnv *env, jobject obj, jint a, jint b)
{
    while (true){
        //反射调用java代码
        jclass cls = env->FindClass("org/bing/testjni/MainActivity");
        if (cls == NULL) {
            break;
        }
        jmethodID ShowMsg = env->GetMethodID(cls, "ShowMsg", "()V");
        if (ShowMsg == NULL) {
            break;
        }
        // 调用构造初始化
//        jmethodID init = env->GetMethodID(cls, "<init>", "()V");
//        jobject obj1 = env->NewObject(cls, init);
        env->CallVoidMethod(obj, ShowMsg);
        break;
    }
    return a + b;

}


3. 如上的函数签名信息如何获取
在工程bin/classes目录下 输入命令:
javap -p -s org.bing.testjni.MainActivity
javap -p -s 包名.类名

同样可以将生成头文件和查询都做成脚本 方便使用

3. 输出结果





ndk学习18: JNI之C&C++调用Java的更多相关文章

  1. ndk学习20: jni之OnLoad动态注册函数

    一.原理 当在系统中调用System.loadLibrary函数时,该函数会找到对应的动态库, 然后首先试图找到"JNI_OnLoad"函数,如果该函数存在,则调用它 JNI_On ...

  2. android NDK 实用学习(五)-c++端调用java接口

    1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 ...

  3. Android JNI和NDK学习(09)--JNI实例二 传递类对象

    1 应用层代码 NdkParam.java是JNI函数的调用类,它的代码如下:   package com.skywang.ndk; import android.app.Activity; impo ...

  4. Android JNI和NDK学习(06)--JNI的数据类型(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 本文介绍JNI的数据类型.NDK中关于JNI数据类型的 ...

  5. NDK学习笔记-JNI数据类型和属性方法的访问

    JNI实现了C/C++与Java的相互访问,那么这篇文章就从C/C++访问Java开始说起 native函数说明 每个native函数,都至少有两个参数(JNIEnv *和jclass或jobject ...

  6. NDK学习笔记-JNI开发流程

    JNI(Java Native Interface)Java本地化接口,Java调用C/C++,C/C++调用Java的一套API接口 实现步骤 在Java源文件中编写native方法 public ...

  7. android学习笔记----JNI中的c控制java

    面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为:      1).将知识分解 ...

  8. JNI编程,C++调用Java

    本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函 ...

  9. ndk学习17: jni之Java调用C&C++

    一.Hello World 1. 定义函数原型 native关键字定义的函数即为jni函数 2.生成头文件 切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录) javah ...

随机推荐

  1. You Can Do Research Too

    You Can Do Research Too I was recently discussing gatekeeping and the process of getting started in ...

  2. CLR

    [精]步步为营 C# 技术漫谈 三.公共语言运行库(CLR) http://www.cnblogs.com/springyangwc/archive/2011/06/12/2079250.html [ ...

  3. VM EXSI安装使用

    1.下载VM ESXI:http://lookdfw.blog.163.com/blog/static/5824974220139295524473/ 2.安装VM ESXI: 参考网址:http:/ ...

  4. ProFTPD <=1.3.5 mod_copy 未授权文件复制漏洞

    poc如下: #!/usr/bin/env python# coding=utf-8 """Site: http://www.beebeeto.com/Framework ...

  5. Entity Framework - Using Transactions or SaveChanges(false) and AcceptAllChanges()?

    LINK With the Entity Framework most of the time SaveChanges() is sufficient. This creates a transact ...

  6. Yii2.0-生成二维码实例

    原文地址:http://www.yii-china.com/post/detail/19.html

  7. _SYS_LIB="-lm -lnsl -ldl"

    -lm  是指连接libm.so     意思是连接数学库, -lnsl  如果涉及RPC编程,必然需要libnsl.so,因此必须在编译选项里加入 -lnsl.      gcc 编译选项 -L是要 ...

  8. Nosql 之 Redis(可做缓存 )

    下载 可以下载解压安装的 地址:https://github.com/dmajkic/redis/downloads 修改 redis.conf 取消注释 requirepass foobared运行 ...

  9. dwz 多选删除

    <li><a title="确实要删除这些用户吗?" target="selectedTodo" postType="string& ...

  10. php 关于时区 date gmdate date_default_timezone_set/get 终极答疑

    关于GMT和UTC时间? GMT+0800 Greenwich: [gri:nitf], 格林威治/格林尼治.是英国伦敦泰晤士河附近的一个小镇 Mean: adj. 自私的; n. 平均.. he i ...