ndk学习18: JNI之C&C++调用Java

一.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. 输出结果

来自为知笔记(Wiz)

ndk学习18: JNI之C&C++调用Java

时间: 2024-10-09 09:08:02

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

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

一.Hello World 1. 定义函数原型 native关键字定义的函数即为jni函数 2.生成头文件 切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录) javah -jni 包名.类名 在根目录下生成: org_bing_testjni_MainActivity.h 3. 工程中添加jni代码 工程右键->添加native code->输入名字->finish 多了如下文 新建一个Application.mk,配置相关选项(详细查看ndk有关Appl

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

1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 android NDK 实用学习(三)- java端类对象的构造及使用 android NDK 实用学习(四)-类缓存 2,java端类接口定义: 1 public class RTKNativeManager { 2 // 其他接口 3 4 // 开给c++端的接口 5 public static

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

1 应用层代码 NdkParam.java是JNI函数的调用类,它的代码如下: package com.skywang.ndk; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class NdkParam extends Activity { public static final String TAG="skywang--NdkParam"; /** Cal

Android学习JNI,使用C调用JAVA语言

本节学习使用C语言调用JAVA语言.在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI.这样可以将C返回的值显示在界面上. 本节模拟传感器返回的值,通过进度条显示灵敏度,然后显示到界面上. 1:界面布局就补多说了.里面就2个Button,一个用于开启监控,一个用于关闭监控,一个进度条 2:Activity代码如下: //开始监控button public void start(View v) { startMonitor(); } //停止

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

面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为:      1).将知识分解成不同粒度的小概念.      2).对概念进行分类,形成类.模块.系统      3).用计算机语言将其实现为对象(包含操作和数据) 然而,大多程序员编写代码时很少思考面向对象的体系是如何实现的.因为它属于底层,并不必要.但是,学习过Java反射技术并有所思考的人会意识到,面向对象的种种语法本身也

jni中c代码调用java代码

原理是使用反射的机制 java中反射的例子: Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider"); //找到类 Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{}); //找到类的方法 declaredMethod.invoke(forName.newI

JNI中C调用Java方法

背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DataProvider_callmethod1 (JNIEnv * env, jobject obj){ //在c代码里面调用java代码里面的方法 // java 反射 //1 . 找到java代码的 class文件

Android JNI入门第六篇——C调用Java

本篇将介绍在JNI编程中C调用Java实现. 源码下载地址:http://download.csdn.net/detail/xyz_lmn/4868265 关键代码: java: [java] view plaincopyprint? public class CCallJava { public static String getTime() { Log.d("CCallJava",  "Call From C Java Static Method" +Strin

JniHelper调用java静态和非静态方法总结(即cocos2dx中调用android平台下显示第三方广告)

调用非静态方法首先就是调用的静态方法得到要调用的java的类对象然后通过调用minfo.env->CallVoidMethod(activityObj, minfo.methodID);方法把对象和要调用的方法以及参数(如果有 )传递个java类对象中的非静态方法: java类: // c++中調用的方法public static Object rtnActivity() {System.out.println("----------rtnActivity");return ma