[笔记]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地址


相关文章
|
1月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
304 76
|
2月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
86 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
228 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
95 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
2月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
75 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
安全 Android开发 iOS开发
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
139 1
|
11月前
Visual Studio 2022 中VLD库如何安装
Visual Studio 2022 中VLD库如何安装
772 1
|
11月前
Visual Studio 2022 中VLD库如何安装
Visual Studio 2022 中VLD库如何安装
772 0
|
10月前
|
IDE 开发工具 C语言
Visual Studio 2017 安装及使用(新手)
Visual Studio 2017 安装及使用(新手)
1618 0
|
9月前
|
弹性计算 自然语言处理 Windows
通义灵码 Visual Studio 下载安装指南(附安装包)
本安装步骤适用于 Windows 10 及以上操作系统中安装和使用通义灵码。
133541 20
下一篇
oss创建bucket