1.主线程中调用Java方法

Demo.java

    public native void nativeCallJava();public static native void nativeCallJava2();public void test1() {Log.e("TAG", "test1");}public static int test2(String s) {int i = Integer.parseInt(s);Log.e("TAG", "test2=" + i);return i;}

native-lib.cpp

Java_com_zhangyu_mypthread_test_Demo_nativeCallJava(JNIEnv *env, jobject thiz) {//1.获取jclassjclass clazz = env->GetObjectClass(thiz);//2.获取jmethodIDjmethodID jmid = env->GetMethodID(clazz,"test1", "()V");//3.调用env->CallVoidMethod(thiz,jmid);
}extern "C"
JNIEXPORT void JNICALL
Java_com_zhangyu_mypthread_test_Demo_nativeCallJava2(JNIEnv *env, jclass clazz) {jmethodID jmid = env->GetStaticMethodID(clazz,"test2", "(Ljava/lang/String;)I");jstring js = env->NewStringUTF("123");env->CallStaticIntMethod(clazz,jmid,js);env->DeleteLocalRef(js);
}
2020-04-27 23:59:15.240 2624-2624/com.zhangyu.mypthread E/TAG: test1
2020-04-27 23:59:15.240 2624-2624/com.zhangyu.mypthread E/TAG: test2=123

2.子线程中调用Java方法

JavaListener.h

//
// Created by 54013 on 2020/4/28.
//#ifndef MYPTHREAD_JAVALISTENER_H
#define MYPTHREAD_JAVALISTENER_H#include <jni.h>class JavaListener {public:JavaVM *jvm;JNIEnv *jenv;jobject jobj;jmethodID jmid;public:JavaListener(JavaVM *vm, JNIEnv *env, jobject obj);~JavaListener();void callJava(bool isMainThread, float progress);
};#endif //MYPTHREAD_JAVALISTENER_H

JavaListener.cpp

//
// Created by 54013 on 2020/4/28.
//#include "JavaListener.h"JavaListener::JavaListener(JavaVM *vm, JNIEnv *env, jobject obj) {jvm = vm;jenv = env;jobj = obj;jclass clazz = env->GetObjectClass(obj);jmid = env->GetMethodID(clazz, "nativeCallJavaProgress", "(F)V");
}void JavaListener::callJava(bool isMainThread, float progress) {if (isMainThread) {jenv->CallVoidMethod(jobj, jmid, progress);} else {/*** c++子线程中调用java方法* 由于JniEnv是线程相关的,所以子线程中不能使用主线程的JniEnv。* 由于JVM是进程相关的,所以可以通过JVM获取当前线程的JniEnv,然后就可以和上面一样调用java方法了*/JNIEnv *env;jvm->AttachCurrentThread(&env, 0);env->CallVoidMethod(jobj, jmid, progress);jvm->DetachCurrentThread();}
}

native-lib.cpp

JavaVM *jvm;
JavaListener *javaListener;
pthread_t childThread;//获取jvm
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv *env;jvm = vm;if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {return -1;}return JNI_VERSION_1_6;
}//子线程的回调,具体执行内容
void *childThreadCallBack(void *data) {JavaListener *jlistener = static_cast<JavaListener *>(data);jlistener->callJava(false, 51);pthread_exit(&childThread);
}extern "C"
JNIEXPORT void JNICALL
Java_com_zhangyu_mypthread_test_Demo_testProgress(JNIEnv *env, jobject thiz) {//env->NewGlobalRef(thiz)生成一个全局的jobject这样主线程,子线程都可以用javaListener = new JavaListener(jvm, env, env->NewGlobalRef(thiz));//主线程调用javaListener->callJava(true, 50);//子线程调用pthread_create(&childThread, NULL, childThreadCallBack, javaListener);
}
2020-04-28 01:11:24.423 7934-7934/? E/TAG: progress: 50.0
2020-04-28 01:11:24.426 7934-7962/? E/TAG: progress: 51.0

Android nck c++调用java方法相关推荐

  1. android jni 结构体_Android应用开发Android JNI-c/c++调用java方法

    本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助. " Android   JNI-c/c++调用java方法, ...

  2. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  3. cocos2dx在Android studio运行 以及在 Android 平台上使用 JavaScript 直接调用 Java 方法

    cocos2dx在Android studio运行 以及在 Android 平台上使用 JavaScript 直接调用 Java 方法 cocos2dx在Android studio运行 使用Andr ...

  4. android JNI基本库(jsting转string和C多线程调用java方法的说明)

    1.JNI开发时经常需要使用到jstring和string的转换,还有C++多线程中使用JNIEnv,因此特意写了这个类,方便以后的开发使用. 注意:  如果要使用打印日志的LOGI和LOGE需要在m ...

  5. JNI基础 c语言调用java方法

    利用c语言调用java无参的方法 java方法 com.example.jniparsedata.ParseData类中的方法     //打印     public void sayHelloFro ...

  6. Java 反射 C 反射调用 java 方法

    1. Java 反射 1.1 创建 Demo.java 类 public class Demo {public void hello(String str){System.out.println(st ...

  7. js调java并传参_Js调用Java方法并互相传参的简单实例

    Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import ...

  8. C++调用Java方法

    最近在搞JNI那块,发现网上很多都是Java调用JNI,然后再调用C++的方法.而当C++函数里调用Java的方法,网上的文章可以说是少之又少,所以写此篇文章共勉.... 本文介绍两种方法,一是C++ ...

  9. c 调用java post方法_C#调用Java方法(详细实例)

    C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...

最新文章

  1. 一台支持vlan管理的交换机_关于交换机的VLAN技术你了解多少?
  2. 防抖 节流_每日一题手写函数防抖与节流
  3. 李开复:不是言AI必称中美,而是欧洲太堂吉诃德
  4. C#中多线程和定时器是不是有冲突?
  5. [html] 说说你对<meta>标签的理解
  6. Bringing up interface eth0: Device eth0 does not seem to be presen
  7. 动手学PaddlePaddle(5):迁移学习
  8. java程序员 进阶_Java程序员进阶架构师的五个阶段,你到
  9. android edittext最多输入,android 中如何限制 EditText 最大输入字符数
  10. ios图片剪切之圆形头像
  11. java异常的嵌套和级联
  12. win7 简体中文旗舰版 MSDN官方原版
  13. 如何安装.nupkg文件?
  14. mac系统 查找英文目录
  15. Parsing error: Decorators cannot be used to decorate object literal properties
  16. J-LINK放了一晚,不能识别,灯一直闪
  17. 一文带你深入浅出C语言运算符、表达式和语句
  18. nvm: node版本管理器[使用教程]
  19. Django Iframe +Form 上传图片文件等 前端显示
  20. JK触发器计算机符号,JK触发器

热门文章

  1. Android开发学习之路-脱壳反编译
  2. bmp180气压传感器工作原理_称重传感器的工作原理和传感器的种类
  3. 爬取豆瓣短评并输出词云
  4. ProxmoxVE6.2 虚拟机导入导出
  5. 青山座座皆巍峨,壮心上下勇求索——2016年终总结
  6. 如何在python中调用MATLAB代码(利用anaconda完美解决多python环境问题)
  7. Latex之图片格式EPS
  8. 万豪国际预计于2022年将在全球范围内开设超过30家奢华酒店;四季酒店集团2023年全新私人飞机行程发布 | 全球旅报...
  9. 【转】html 代码中 table 跨行跨列的操作
  10. LaTeX入门学习-WinEdt