[笔记]Visual Studio 2015 开发安卓so库JNI层——回调调用

简介: [笔记]Visual Studio 2015 开发安卓so库JNI层——回调调用

JNI调用java函数

Android JNI回调的三种方法

以下以静态方法为例

在app端创建回调方法

同上个例子 在com.example.helloso.MainActivity中

创建一个静态回调函数

public static void Callback_GetString(){
      Toast.makeText(mContext,"Callback_GetString",Toast.LENGTH_SHORT);
      Log.i(TAG,"Callback_GetString");
  }

在so代码中调用回调

在c++函数中调用回调函数

//该函数同上一节对应java native函数 com.example.helloso.MainActivity中HelloWorld()
jstring Java_com_example_helloso_MainActivity_HelloWorld(JNIEnv* env, jobject thiz) {
  LOGE("Start HelloWorld");
  Callback_TestVoid();
  LOGE("End HelloWorld");
  return env->NewStringUTF("Java_com_example_helloso_MainActivity_HelloWorld");
}

重写JNI_Onload函数 在载入时加载确定jni回调函数的ID

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
  LOGI("Start JNI_OnLoad");
  JNIEnv* env;
  g_pJavaVM = vm;
  if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) {
    return JNI_ERR; // JNI version not supported.
  }
  jclass  clz = env->FindClass(
    "com/example/helloso/Callback");
  g_jniHelperClz = (jclass)env->NewGlobalRef(clz);
  jmethodID  jniHelperCtor = env->GetMethodID(g_jniHelperClz,
    "<init>", "()V");
  jobject    handler = env->NewObject(g_jniHelperClz,
    jniHelperCtor);
  g_jniHelperObj = env->NewGlobalRef(handler);
  /
  g_methodTestVoid = env->GetStaticMethodID(g_jniHelperClz,
    "Callback_TestVoid", "()V");
  g_methodTestString = env->GetStaticMethodID(g_jniHelperClz,
    "Callback_TestString", "(Ljava/lang/String;)Ljava/lang/String;");
  g_methodTestByteArray = env->GetStaticMethodID(g_jniHelperClz,
    "Callback_TestByteArray", "([BI)[B");
  ///
  g_mainActivityObj = NULL;
  LOGI("End JNI_OnLoad");
  return  JNI_VERSION_1_6;
}

回调函数调用,先获得env,再通过全局jmethodID 调用java函数

void Callback_TestVoid() {
  LOGE("Star
  t Callback_TestVoid");
  JNIEnv *env;
  jint res = g_pJavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
  if (g_methodTestVoid != NULL) {
    LOGE("Start CallStaticVoidMethod");
    env->CallStaticVoidMethod(g_jniHelperClz, g_methodTestVoid);
  }
  LOGE("End Callback_TestVoid");
}

解释GetMethodID 获得函数地址

jmethodID GetMethodID(jclass clazz, const char* name, const char* sig);//获得函数地址
jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig);//获得静态函数地址

sig表示标识函数格式

sig参数示意:  

boolean:Z

byte:B

char:C

short:S

int:I

long:J

float:F

double:D

void:V

[数组]:[+类型

Object对象:L包名/类名; 或包名/类名$标识嵌套类;

例子(方法 ->- 对应的sig):  

void M1(int A,int B) ->- “(II)V”

void M2(String S) ->- “(Ljava/lang/String;)V”  

void M3(int[] I) ->- “([I)V”  

String M4(String S) ->-"(Ljava/lang/String;)Ljava/lang/String"  

long M5(int I,Class class) ->- “(ILjava/lang/Class;)J”  

void M6(long LONG) ->- “(J)V”

番外 JNI java string到c/c++相关

JAVA和C++通过JNI传递中文乱码问题的解决方案

Android Native 开发之 NewString 与 NewStringUtf 解析

Android jni/ndk编程二:jni数据类型转换(primitive,String,array)

jni直接转byte_JNI jbyteArray转char*

String 
      (UTF-16)
          |
[java]    |
--------------------  JNI 调用
[cpp]     |
          v
       jstring 
       (UTF-16)
          |   
 +--------------------------+---------------------------+
 |GetStringChars/NewString  |GetStringUTFChars/NewStringUTF
 |                                                 |
 v                                                 v
wchar_t*                                         char*
(UTF_16)                                        (UTF-8)

总结

demo地址


相关文章
|
2天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
1天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
11 5
|
3天前
|
存储 IDE 开发工具
探索Android开发之旅:从新手到专家
【10月更文挑战第26天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何在Android平台上从零开始,最终成为一名熟练的开发者。通过简单易懂的语言和实际代码示例,本文将引导你了解Android开发的基础知识、关键概念以及如何实现一个基本的应用程序。无论你是编程新手还是希望扩展你的技术栈,这篇文章都将为你提供价值和启发。让我们开始吧!
|
7天前
|
设计模式 IDE Java
探索安卓开发:从新手到专家的旅程
【10月更文挑战第22天】 在数字时代的浪潮中,移动应用开发如同一座金矿,吸引着无数探险者。本文将作为你的指南针,指引你进入安卓开发的广阔天地。我们将一起揭开安卓平台的神秘面纱,从搭建开发环境到掌握核心概念,再到深入理解安卓架构。无论你是初涉编程的新手,还是渴望进阶的开发者,这段旅程都将为你带来宝贵的知识和经验的财富。让我们开始吧!
|
7天前
|
搜索推荐 Android开发 UED
安卓开发中的自定义视图:打造个性化用户界面
【10月更文挑战第22天】在安卓应用的海洋中,如何让你的应用脱颖而出?一个独特且直观的用户界面(UI)至关重要。本文将引导你通过自定义视图来打造个性化的用户体验,从基础的视图绘制到触摸事件的处理,我们将一步步深入探讨。准备好了吗?让我们开始吧!
|
6月前
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
392 1
|
3月前
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
3月前
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
69 5
|
3月前
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
49 3
|
3月前
|
编解码 Android开发 iOS开发
安卓与iOS开发:平台差异下的技术创新之路
在数字时代的浪潮中,移动应用开发如同两股潮流——安卓与iOS,各自携带着独特的技术生态和文化基因。本文将深入探讨这两大平台的开发环境、编程语言和工具的差异,以及它们如何塑造了不同的用户体验和技术趋势。通过比较分析,我们旨在揭示跨平台开发的可能性和挑战,同时探索未来技术创新的方向。让我们一起跟随代码的足迹,穿越安卓的开放草原和iOS的精密园林,发现那些隐藏在平台差异之下的创新机遇。
40 1

热门文章

最新文章