在Android JNI环境下使用C++ Lambda表达式等(附apk包供测试)
16lz
2021-01-23
前提:
需要使用支持更高gcc版本的第三方NDK包。Android默认版本为:4.4.3。
第三方NDK包下载(gcc-4.6.3):http://www.crystax.net/en/android/ndk/7
具体使用注意事项请参考此文。本测试主要展示以下内容:
1、使用std::function和std::bind实现sigslot机制;2、使用C++11的Lambda表达式
3、在C++代码中回调Java对象的方法
例子来源:
本测试例子来自网上的一个讨论里的回复,由于看到有lambda表达式,就有了在iOS及Android环境下测试的念头。
http://stackoverflow.com/questions/12516239/a-simple-signal-for-a-button-in-c
主要代码片段:
定义回调类型typedef std::function<void(const char *)> callback_t;定义一个全局回调函数指针,以方便GenericButton类内调用,初始化见下面的代码。
callback_t jni_callback;
导出JNI函数。此函数的主要功能:内部查找Java类的messageMe方法,以便进行回调。回调messageMe的方法用了三种:直接使用JNIEnv调用;直接调用Lambda回调函数;在GenericButton类中调用(通过sigslot_main函数,此函数即原例子的main方法)。
extern "C" { JNIEXPORT jstring JNICALL Java_com_sigslot_MainActivity_sigSlot( JNIEnv* env, jobject thiz ) { jstring jstr = env->NewStringUTF("This comes from jni(via JNIEnv directly).\n"); jclass clazz = env->FindClass("com/sigslot/MainActivity"); jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)Ljava/lang/String;"); jobject result = env->CallObjectMethod(thiz, messageMe, jstr); jni_callback=[env, thiz, messageMe](const char* info){ LOGI(info); jstring jstr2 = env->NewStringUTF(info); env->CallObjectMethod(thiz, messageMe, jstr2); }; jni_callback("Lambda in std::function (via lambda callback).\n"); sigslot_main(); // call GenericButton's pressButton method. return env->NewStringUTF("sigslot main from JNI C++!"); }}
apk包:
仅供有兴趣的朋友下载、安装、测试。下载链接:http://download.csdn.net/detail/dyw/4674834
更多相关文章
- Kernel.org 被黑,获取 Android 源码方法一则
- 关于android连续点击出现多个Activity界面的解决方法
- Android 渗透测试学习手册 第三章 Android 应用的逆向和审计
- 58同城android客户端手机号码解密方法
- android 开发使用 kotlin 进行点击事件监听和界面跳转,直接传也方
- Monkey测试结果解析(二)
- Unable to start activity ComponentInfo 解决方法