在上一篇的基础上,添加在C++代码中回调java方法。

代码如下:

Demo.java 中添加callback函数, 打印一条log.

package com.example.scarecrow.dynamicregisterjni;

import android.util.Log;

public class Demo {
public static final String TAG = "Demo"; static {
System.loadLibrary("JniTest");
Log.d(TAG, "dynamic lib loaded");
} public static native String sayHello(); public static void callback(String message) {
Log.d(TAG, message);
}
}

JniTest.cpp 中添加myCallBack方法,在myDynamicJNI中调用,传个字符串回到JAVA。注意:java端的方法是static的话,一定要用GetStaticMethodID和CallStaticVoidMethod。

//
// Created by yuany on 6/5/18.
//
#include <jni.h>
#include "android/log.h"
#include <cassert> #define LOG_TAG "C_TAG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) //native method
void myCallBack (JNIEnv *env, jclass jobj)
{
LOGD("myCallBack");
jclass clazz; //找到声明native方法的类
clazz = env->FindClass("com/example/scarecrow/dynamicregisterjni/Demo");
if(clazz == NULL){
LOGD("Findclass error");
return;
}
LOGD("Findclass succeed"); //寻找class里面的方法
jmethodID callbackID = env->GetStaticMethodID(clazz, "callback", "(Ljava/lang/String;)V");
if(callbackID==){
LOGD("find callback error");
return;
}
LOGD("find callback "); jstring result = env->NewStringUTF("this is a callback from C++ codes");
//invoke callback method
env->CallStaticVoidMethod(jobj,callbackID, result);
} //native method
jstring myDynamicJNI (JNIEnv *env, jclass jobj)
{
LOGD("myDynamicJNI");
//invoke callback method
myCallBack(env, jobj);
return env->NewStringUTF("This is my first dynamic JNI test");
} /*需要注册的函数列表,放在JNINativeMethod 类型的数组中,
以后如果需要增加函数,只需在这里添加就行了
参数:
1.java代码中用native关键字声明的函数名字符串
2.签名(传进来参数类型和返回值类型的说明)
3.C/C++中对应函数的函数名(地址)
*/
static JNINativeMethod getMethods[] = {
{"sayHello","()Ljava/lang/String;",(void*)myDynamicJNI},
};
//此函数通过调用JNI中 RegisterNatives 方法来注册我们的函数
static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* getMethods,int methodsNum){
LOGD("registerNativeMethods");
jclass clazz;
//找到声明native方法的类
clazz = env->FindClass(className);
if(clazz == NULL){
return JNI_FALSE;
}
LOGD("after Findclass");
//注册函数 参数:java类 所要注册的函数数组 注册函数的个数
if(env->RegisterNatives(clazz,getMethods,methodsNum) < ){
return JNI_FALSE;
}
LOGD("after RegisterNatives");
return JNI_TRUE;
} //回调函数 在这里面注册函数
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){ LOGD("JNI_OnLoad");
JNIEnv* env = NULL;
//判断虚拟机状态是否有问题
if(vm->GetEnv((void**)&env,JNI_VERSION_1_6)!= JNI_OK){
return -;
}
assert(env != NULL);
//指定类的路径,通过FindClass 方法来找到对应的类
const char* className = "com/example/scarecrow/dynamicregisterjni/Demo";
//开始注册函数 registerNatives -》registerNativeMethods -》env->RegisterNatives
if(!registerNativeMethods(env,className,getMethods, )){
return -;
}
//返回jni 的版本
return JNI_VERSION_1_6;
}

关于JNI更多详细内容可以参考https://blog.csdn.net/rainteen/article/details/43376337#t0

Android jni中回调java的方法的更多相关文章

  1. Android C代码回调java方法

    本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...

  2. ZT ANDROID jni 中的事件回调机制JNIenv的使用 2012-09-10 12:53:01

    ANDROID jni 中的事件回调机制JNIenv的使用 2012-09-10 12:53:01 分类: 嵌入式 android framework 里java调用native,使用JNI机制,ja ...

  3. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...

  4. Jni层回调java代码【转】

    本文转载自:http://www.linuxidc.com/Linux/2014-03/97562.htm JNI是Java Native Interface的缩写,是Java平台的重要特性,使得Ja ...

  5. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  6. [原创]Android系统中常用JAVA类源码浅析之HashMap

    由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...

  7. 快速掌握 Android Studio 中 Gradle 的使用方法

    快速掌握 Android Studio 中 Gradle 的使用方法 Gradle是可以用于Android开发的新一代的 Build System, 也是 Android Studio默认的build ...

  8. 003android初级篇之【转】Android开发中颜色的定义方法

    正好用到颜色的定义,但脑子里没有记住具体,转载一篇加强印象 1.使用Color类的常量,如: int color = Color.BLUE; // 创建一个蓝色 是使用Android提供的颜色 int ...

  9. 在android开发中使用multdex的方法-IT蓝豹为你整理

    Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...

随机推荐

  1. js判断类型的四种方法

    typeof:使用typeof可以很方便的判断六种类型:undefined.boolean.string.number.object.function 数组和null会被判断为object类型 ins ...

  2. Maven入门介绍

    一.Maven的基本概念 1.1为什么需要Maven(作用) Ⅰ. 大家都知道使用Maven,那么我们为什么要要使用maven大家思考过吗?其实我也只是对maven入门阶段,刚刚接触的时候只是知道使用 ...

  3. YII实现restful,postman进行接口测试

    Yii2 restful API文档 一.配置模块: 1.Config/main.php: 2.创建模块目录: 3.Module.php: 二.路由配置: 三.控制器: 四.Models: 五.测试: ...

  4. day32-python阶段性复习六

    面向对象编程的一种方法一些皆对象面向过程和面向对象编程面向过程编程:函数式编程.c等面向对象编程:c++ ,java,python等看具体问题用哪种方法 类和对象:是面向对象中的两个重要的概念类:是对 ...

  5. c、c++函数随机

    #inlcude<algorithm> next_permutation函数<全排列函数> #include<stdio.h> #include<algori ...

  6. phython安装

    点击   https://www.python.org/downloads/ 下载合适的Python版本 下载获取到:python-x.x.x.msi安装包,我们双击python-x.x.x.msi即 ...

  7. 微信小程序des加密、PHP des解密

    最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式, 引用的插件为tripledes.js,https://github.com/Favour1111in/h ...

  8. windows环境搭建Vue开发环境

    一.安装node.js(https://nodejs.org/en/) 下载完毕后,可以安装node,建议不要安装在系统盘(如C:). 二.设置nodejs prefix(全局)和cache(缓存)路 ...

  9. usermod语法

    语法 usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G ...

  10. 环境搭建、RF库

    一.Python27安装 1.双击安装python-2.7.13-64位.msi 2.检查python:cmd命令行→[python]→回车,出现如图所示,表示成功 可能出现:'python'不是内部 ...