本文将讲述下列三种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对象 可选的参数 调用方法时接收的参数

接下来实战项目实现

新建项目,布局如下:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity" >
  7.  
  8. <Button
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:onClick="callbackvoid"
  12. android:text="回调null方法" />
  13.  
  14. <Button
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:onClick="callbackint"
  18. android:text="回调int参数方法" />
  19.  
  20. <Button
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:onClick="callbackString"
  24. android:text="回调String参数方法" />
  25.  
  26. </LinearLayout>

新建JNI.java

  1. package com.wuyudong.callbackjava;
  2.  
  3. public class JNI {
  4.  
  5. static{
  6. System.loadLibrary("callback");
  7. }
  8.  
  9. public native void callbackvoidmethod();
  10.  
  11. public native void callbackintmethod();
  12.  
  13. public native void callbackStringmethod();
  14.  
  15. // C调用java空方法
  16. public void helloFromJava() {
  17. System.out.println("hello from java");
  18.  
  19. }
  20.  
  21. // C调用Java中的带两个int参数的方法
  22. public int add(int x, int y) {
  23. return x + y;
  24. }
  25.  
  26. // C调用java中参数为String的方法
  27. public void printString(String s) {
  28. System.out.println(s);
  29.  
  30. }
  31. }

MainActivity.java

  1. package com.wuyudong.callbackjava;
  2.  
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.view.Menu;
  6. import android.view.View;
  7.  
  8. public class MainActivity extends Activity {
  9.  
  10. JNI jni;
  11.  
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. jni = new JNI();
  17. }
  18.  
  19. public void callbackvoid(View v) {
  20. jni.callbackvoidmethod();
  21. }
  22.  
  23. public void callbackint(View v) {
  24. jni.callbackintmethod();
  25. }
  26.  
  27. public void callbackString(View v) {
  28. jni.callbackStringmethod();
  29. }
  30. }

callback.c

  1. #include <jni.h>
  2. #include <android/log.h>
  3. #define LOG_TAG "System.out"
  4. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
  5. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
  6.  
  7. JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackvoidmethod(
  8. JNIEnv * env, jobject clazz) {
  9. //1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);
  10. jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");
  11.  
  12. //2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
  13. jmethodID methodID = (*env)->GetMethodID(env, claz, "helloFromJava", "()V");
  14.  
  15. //3、通过字节码对象创建一个Object(即是clazz)
  16. //4、通过对象调用方法
  17. (*env)->CallVoidMethod(env, clazz, methodID);
  18.  
  19. }
  20.  
  21. JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackintmethod(
  22. JNIEnv * env, jobject clazz) {
  23. //1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);
  24. jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");
  25.  
  26. //2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
  27. jmethodID methodID = (*env)->GetMethodID(env, claz, "add", "(II)I");
  28.  
  29. //3、通过字节码对象创建一个Object(即是clazz)
  30. //4、通过对象调用方法
  31. int result = (*env)->CallIntMethod(env, clazz, methodID, , );
  32. LOGD("result = %d", result);
  33.  
  34. }
  35.  
  36. JNIEXPORT void JNICALL Java_com_wuyudong_callbackjava_JNI_callbackStringmethod(
  37. JNIEnv * env, jobject clazz) {
  38. //1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);
  39. jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");
  40.  
  41. //2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
  42. jmethodID methodID = (*env)->GetMethodID(env, claz, "printString",
  43. "(Ljava/lang/String;)V");
  44.  
  45. //3、通过字节码对象创建一个Object(即是clazz)
  46. //4、通过对象调用方法
  47. //char* str = "hello from c!";
  48. jstring result = (*env)->NewStringUTF(env, "hello from c");
  49. (*env)->CallVoidMethod(env, clazz, methodID, result);
  50.  
  51. }

获取更多C语言与算法相关知识,关注公众号:“csuanfa”

Android C代码回调java方法的更多相关文章

  1. Android jni中回调java的方法

    在上一篇的基础上,添加在C++代码中回调java方法. 代码如下: Demo.java 中添加callback函数, 打印一条log. package com.example.scarecrow.dy ...

  2. Android NDK开发(五)--C代码回调Java代码【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...

  3. Unity调用Android Studio中的Java方法

    1. 新建Unity项目: 2. Android Studio中新建EmptyActivity: 3. 新建安卓项目时记住最小版本号: 4. 将左侧项目文件浏览面板切换到Project项下,在本项根节 ...

  4. Android JNI之调用JAVA方法的返回类型签名

    从http://blog.csdn.net/lonelyroamer/article/details/7932787截取的 如何签名: 下面看看Sign签名如何写,来表示要取得的属性或方法的类型. 1 ...

  5. JNI C反射调用java方法

    前面记录了调用C的学习笔记,现在来记录一下C反射调用Java的笔记.JNI开发学习之调用C方法 Android开发中调用一个类中没有公开的方法,可以进行反射调用,而JNI开发中C调用java的方法也是 ...

  6. Android使用JNI实现Java与C之间传递数据(转)

    介绍Java如何将数据传递给C和C回调Java的方法.  java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需 ...

  7. Android使用JNI实现Java与C之间传递数据

    介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需要 ...

  8. Java 断点下载(下载续传)服务端及客户端(Android)代码

    原文: Java 断点下载(下载续传)服务端及客户端(Android)代码 - Stars-One的杂货小窝 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一 ...

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

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

随机推荐

  1. 【转】同一台Windows机器中启动多个Memcached服务

    上一篇介绍了Memcached的安装,但是如果手头上只有一台机器,又想做多节点测试咋办? 这就需要在一台机器上启动多个Memcached服务了. 假设Memcached在如下目录:C:\memcach ...

  2. VB.NET Winform的一些功能实现

    近段时间,开发的需要,需要写一个winform的程序.用VB.NET来写. 开发开始,需要实现一个窗体设为多文档界面 (MDI) 子窗体的容器.实现这个功能,开始找资料,得知设置一个属性:Form.I ...

  3. Excel导入数据库脚本

    --数据库中不存在需要导入的表 SELECT * INTO tab_PurchasePriceTemp FROM OPENROWSET( 'Microsoft.Jet.OLEDB.4.0', 'EXC ...

  4. Jquery验证插件 JqueryValidation 动态验证用户名等

    可以参考:http://www.w3cschool.cc/jquery/jquery-plugin-validate.html //form1 验证用户名 $("#form1"). ...

  5. LeetCode3:Longest Substring Without Repeating Characters

    题目: Given a string, find the length of the longest substring without repeating characters. For examp ...

  6. 孙鑫MFC学习笔记16:异步套接字

    16 1.事件对象 2.CreateEvent创建事件对象 3.SetEvent设置事件对象为通知状态 4.ResetEvent设置事件对象为非通知状态 5.InitializeCriticalSec ...

  7. redis-desktop-manager

    介绍一款Redis图形管理工具:redis-desktop-manager 下载地址:点击打开链接 我们打开redis-cl.exe 客户端,在里面添加了key= name ,value=heyang ...

  8. Gym 101102J---Divisible Numbers(反推技巧题)

    题目链接 http://codeforces.com/gym/101102/problem/J Description standard input/output You are given an a ...

  9. Ajax中传递Json格式的参数

    $.ajax({ type: "post", url: baseUrl+"sys/login", dataType: "json", con ...

  10. 性能测试学习之二 ——性能测试模型(PV计算模型)

    PV计算模型 现有的PV计算公式是: 每台服务器每秒平均PV量 =( (总PV*80%)/(24*60*60*40%))/服务器数量 =2*(总PV)/* (24*60*60) /服务器数量 通过定积 ...