码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2022-09-28 Android APP 用interface 接口的形式对jni进行回调,实例测试


     一、看到别人的代码里面用 interface 接口的形式跟jni进行回调,做数据交互,然后就想搞给例子测试一下。

     二、学习最好的方法,就是read the fuck code,有兴趣自己download源码下来分析吧。

    (657条消息) AndroidAPP用interface接口的形式对jni进行回调,实例测试-OS文档类资源-CSDN文库https://download.csdn.net/download/qq_37858386/86725721

    三、实例测试

           1、源码概览

            2、随便看jni 源码

    1. #include<stdlib.h>
    2. #include<pthread.h>
    3. #include<jni.h>
    4. #include<android/log.h>
    5. #include "com_example_jnicallbackdemo_Callbacktest.h"
    6. #define LOG_TAG "JNICALLBACK"
    7. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
    8. jmethodID mid;
    9. jclass objclass;
    10. jobject mobj;
    11. pthread_t thread;
    12. JavaVM *m_vm;
    13. jmethodID javaCallbackId ;
    14. jobject callback;
    15. //初始化的时候会调进来一次,在这个方法里持有jvm的引用
    16. JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved){
    17. m_vm=vm;
    18. JNIEnv* env = NULL;
    19. jint result = -1;
    20. if(m_vm){
    21. LOGD("m_vm init success");
    22. }else{
    23. LOGD("m_vm init failed");
    24. }
    25. if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK){
    26. return result;
    27. }
    28. return JNI_VERSION_1_4;
    29. }
    30. JNIEnv* getJNIEnv(int* needsDetach){
    31. JNIEnv* env = NULL;
    32. jint result = -1;
    33. if ((*m_vm)->GetEnv(m_vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK){
    34. int status = (*m_vm)->AttachCurrentThread(m_vm, &env, 0);
    35. if (status < 0){
    36. LOGD("failed to attach current thread");
    37. return NULL;
    38. }
    39. *needsDetach = 1;
    40. }
    41. LOGD("GetEnv Success");
    42. return env;
    43. }
    44. void *thread_run(){
    45. LOGD("thread start");
    46. LOGD("start noop callback");
    47. int number = 0 ;
    48. int needsDetach;
    49. JNIEnv *evn=getJNIEnv(&needsDetach);
    50. while(1)
    51. {
    52. usleep(1000*1000);
    53. (*evn)->CallVoidMethod(evn, callback, javaCallbackId,number);
    54. number = number+1;
    55. }
    56. }
    57. JNIEXPORT void JNICALL Java_com_example_jnicallbackdemo_Callbacktest_native_1say_1hello(JNIEnv *evn, jobject object,jobject greet_listener){
    58. LOGD("JNIDEMO Java_com_example_jnicallbackdemo_MainActivity_native_say_hello greet_listener ");
    59. if(!greet_listener)
    60. return;
    61. callback = (*evn)->NewGlobalRef(evn, greet_listener);
    62. jclass javaClass = (*evn)->GetObjectClass(evn, callback);
    63. if (javaClass == 0) {
    64. LOGD (" JNIDEMO Unable to find class");
    65. return;
    66. }
    67. javaCallbackId = (*evn)->GetMethodID(evn, javaClass,
    68. "recvWiegandMsg", "(I)V");
    69. if (javaCallbackId == NULL) {
    70. LOGD("JNIDEMO Unable to find method:onProgressCallBack");
    71. return;
    72. }
    73. (*evn)->CallVoidMethod(evn, callback, javaCallbackId,18);
    74. pthread_create(&thread, NULL, thread_run, NULL);
    75. }

            3、用ndk编译jni 成so, 直接到jni源码目录下执行ndk-build命令就可以。

            4、直接看测试效果,查看打印的log

             5、


    四、有价值的参考文章

    Android JNI 篇 - JNI回调的三种方法(精华篇) - 简书 (jianshu.com)https://www.jianshu.com/p/e576c7e1c403
    (658条消息) JNI 接口回调_pang_gua的博客-CSDN博客_jni 回调https://blog.csdn.net/pang_gua/article/details/86634327

  • 相关阅读:
    39.企业快速开发平台Spring Cloud+Spring Boot+Mybatis之Highcharts 标签旋转柱形图
    Tomcat7+ 弱口令 && 后台getshell漏洞
    实践篇1:深度学习之----LetNet之tensorflow2的实现
    Error in render: “TypeError: Cannot read property ‘0‘ of undefined“?
    3ds Max 基于PC系统的3D建模渲染和制作软件
    整合MyBatis
    五种IO模型
    redis三(3-1)
    Go程序(Grpc服务)协程数暴涨的原因排查分析
    asp.net毕业设计项目源码社区保障管理系统
  • 原文地址:https://blog.csdn.net/qq_37858386/article/details/127091581
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号