Android C代码回调java方法
本文将讲述下列三种C代码回调java方法
1、c代码回调java空方法
2、c代码回调java int类型参数方法
3、c代码回调javaString类型参数方法
方法都差不多,先看c代码回调java空方法,其他两种类似:
① 找到字节码对象
//jclass (*FindClass)(JNIEnv*, const char*);
//第二个参数 要回调的java方法所在的类的路径 "com/itheima/callbackjava/JNI"
② 通过字节码对象找到方法对象
//jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
第二个参数 字节码对象 第三个参数 要反射调用的java方法名 第四个参数 要反射调用的java方法签名
javap -s 要获取方法签名的类的全类名 项目/bin/classes 运行javap

③ 通过字节码创建 java对象(可选) 如果本地方法和要回调的java方法在同一个类里可以直接用 jni传过来的java对象 调用创建的Method
jobject obj =(*env)->AllocObject(env,claz);
当回调的方法跟本地方法不在一个类里 需要通过刚创建的字节码对象手动创建一个java对象
再通过这个对象来回调java的方法
需要注意的是 如果创建的是一个activity对象 回调的方法还包含上下文 这个方法行不通!!!回报空指针异常
④ 反射调用java方法
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
第二个参数 调用java方法的对象 第三个参数 要调用的jmethodID对象 可选的参数 调用方法时接收的参数
接下来实战项目实现
新建项目,布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="callbackvoid"
android:text="回调null方法" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="callbackint"
android:text="回调int参数方法" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="callbackString"
android:text="回调String参数方法" /> </LinearLayout>
新建JNI.java
package com.wuyudong.callbackjava;
public class JNI {
static{
System.loadLibrary("callback");
}
public native void callbackvoidmethod();
public native void callbackintmethod();
public native void callbackStringmethod();
// C调用java空方法
public void helloFromJava() {
System.out.println("hello from java");
}
// C调用Java中的带两个int参数的方法
public int add(int x, int y) {
return x + y;
}
// C调用java中参数为String的方法
public void printString(String s) {
System.out.println(s);
}
}
MainActivity.java
package com.wuyudong.callbackjava; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { JNI jni; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jni = new JNI();
} public void callbackvoid(View v) {
jni.callbackvoidmethod();
} public void callbackint(View v) {
jni.callbackintmethod();
} public void callbackString(View v) {
jni.callbackStringmethod();
}
}
callback.c
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackvoidmethod(
JNIEnv * env, jobject clazz) {
//1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);
jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI"); //2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID methodID = (*env)->GetMethodID(env, claz, "helloFromJava", "()V"); //3、通过字节码对象创建一个Object(即是clazz)
//4、通过对象调用方法
(*env)->CallVoidMethod(env, clazz, methodID); } JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackintmethod(
JNIEnv * env, jobject clazz) {
//1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);
jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI"); //2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID methodID = (*env)->GetMethodID(env, claz, "add", "(II)I"); //3、通过字节码对象创建一个Object(即是clazz)
//4、通过对象调用方法
int result = (*env)->CallIntMethod(env, clazz, methodID, , );
LOGD("result = %d", result); } JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackStringmethod(
JNIEnv * env, jobject clazz) {
//1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);
jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI"); //2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID methodID = (*env)->GetMethodID(env, claz, "printString",
"(Ljava/lang/String;)V"); //3、通过字节码对象创建一个Object(即是clazz)
//4、通过对象调用方法
//char* str = "hello from c!";
jstring result = (*env)->NewStringUTF(env, "hello from c");
(*env)->CallVoidMethod(env, clazz, methodID, result); }
获取更多C语言与算法相关知识,关注公众号:“csuanfa”

Android C代码回调java方法的更多相关文章
- Android jni中回调java的方法
在上一篇的基础上,添加在C++代码中回调java方法. 代码如下: Demo.java 中添加callback函数, 打印一条log. package com.example.scarecrow.dy ...
- Android NDK开发(五)--C代码回调Java代码【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...
- Unity调用Android Studio中的Java方法
1. 新建Unity项目: 2. Android Studio中新建EmptyActivity: 3. 新建安卓项目时记住最小版本号: 4. 将左侧项目文件浏览面板切换到Project项下,在本项根节 ...
- Android JNI之调用JAVA方法的返回类型签名
从http://blog.csdn.net/lonelyroamer/article/details/7932787截取的 如何签名: 下面看看Sign签名如何写,来表示要取得的属性或方法的类型. 1 ...
- JNI C反射调用java方法
前面记录了调用C的学习笔记,现在来记录一下C反射调用Java的笔记.JNI开发学习之调用C方法 Android开发中调用一个类中没有公开的方法,可以进行反射调用,而JNI开发中C调用java的方法也是 ...
- Android使用JNI实现Java与C之间传递数据(转)
介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需 ...
- Android使用JNI实现Java与C之间传递数据
介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需要 ...
- Java 断点下载(下载续传)服务端及客户端(Android)代码
原文: Java 断点下载(下载续传)服务端及客户端(Android)代码 - Stars-One的杂货小窝 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一 ...
- Jni层回调java代码【转】
本文转载自:http://www.linuxidc.com/Linux/2014-03/97562.htm JNI是Java Native Interface的缩写,是Java平台的重要特性,使得Ja ...
随机推荐
- QT学习笔记1
不准备用MFC了,想切换到QT.所以跟着网上的一个笔记学习. 1 开发环境是VS2008+QT4.7+VassistX 具体如何配置看这个帖子:http://qimo601.iteye.com/blo ...
- Hyperledger fabric Client Node.js Hello World示例程序
简介 Hyperledger fabric Client (HFC)提供了基于Node.js的应用接口来访问Hyperledger区块. 本文介绍了一个使用HFC访问IBM Bluemixr区块服务的 ...
- MyEclipse中常用的快捷键大全,快来.....
在这里分享点常用的快捷键,希望对你有帮助! Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] ...
- [锋利的JQ]-超链接提示效果
关键知识点: 1.事件对象:当事件一旦被触发,事件对象便会创立.事件对象只能作用于该事件的事件处理程序. 2.认识了mousemove事件了连续触发执行的特性. 代码: HTML: <div c ...
- Emit学习(3) - OpCodes - 动态添加属性、构造函数、方法
上一篇介绍了 IL 的部分, 基础的部分, 暂时就介绍到那里了, 接下来要进入代码编写阶段了. 今天的主题是 在代码运行的过程中, 去动态的创建类, 属性, 方法. 来源:http://www.cnb ...
- ADB pm 命令
usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_TER] pm list permission-grou ...
- GitHub上下载源代码的方法
GitHub上找到自己要下载的项目以后,有3种方法可以下载源代码. 第一种是复制该项目的地址,然后用其他软件下载: 第二种是安装了官方客户端,可以直接点击"Clone in Desktop& ...
- C语言文件方式输入与输出(最简洁方便实用的一种方式)
freopen("inputfile.txt", "r", stdin); freopen("outputfile.txt", " ...
- 最新微信公众平台js sdk整合PHP版
由于没有持续关注微信公众平台相关的开发,所以看到这个东西时,都没有耐心看完开发文档,或者不知道重点. 重点在哪呢?重点在示例代码:http://mp.weixin.qq.com/wiki/7/aaa1 ...
- 第 14 章 CSS 颜色与度量单位
学习要点: 1.颜色表方案 2.度量单位 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 颜色和度量单位等问题,包括颜色的选取方式.相对长度和绝对长度等. 一.颜色表方案 颜色的表现形式主要有 ...