Android Studio NDK 开发之在Native中调用java层的函数
来源:互联网 发布:artistic软件 编辑:程序博客网 时间:2024/06/06 02:20
在Native中调用java层的函数
Java层
JniHandler.java1.调用私有函数输出信息 @Keep private void updateStatus(String msg) { if (msg.toLowerCase().contains("error")) { Log.e("JniHandler", "Native Err: " + msg); } else { Log.i("JniHandler", "Native Msg: " + msg); } }2.获取当前android系统的版本 @Keep static public String getBuildVersion() { return Build.VERSION.RELEASE; }3.获取android系统运行时闲置的内存空间大小 @Keep public long getRuntimeMemorySize() { return Runtime.getRuntime().freeMemory(); }
Native层
由于只是调用这些函数来获取相应的信息因此可以都在
JNI_OnLoad()函数中获取并调用
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env;//将结构体所在内存的每个字节的内容设置为0; memset(&g_ctx, 0, sizeof(g_ctx)); //为结构体的javaVm赋值 g_ctx.javaVM = vm; //拿到该线程的JNIEnv*结构体存入env中 if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } ////////////// jclass clz=(*env)->FindClass(env, "com/wbl/ndktest/JniHandler"); //引用这个JniHandler类 g_ctx.jniHelperClz=(*env)->NewGlobalRef(env,clz); //查找init的方法 jmethodID jniHelperCtor=(*env)->GetMethodID(env,g_ctx.jniHelperClz,"<init>","()V"); //新建一个jniHandler对象 jobject handler=(*env)->NewObject(env,g_ctx.jniHelperClz,jniHelperCtor); //引用这个对象 g_ctx.jniHelperObj=(*env)->NewGlobalRef(env,handler); //找到updateStatus方法. jmethodID updateStatus=(*env)->GetMethodID(env,g_ctx.jniHelperClz,"updateStatus","(Ljava/lang/String;)V"); sendJavaMsg(env,g_ctx.jniHelperObj,updateStatus,"Hello EveryOne"); queryRuntimeInfo(env,g_ctx.jniHelperObj); return JNI_VERSION_1_6;}//调用updateStatus方法 发送一个消息void sendJavaMsg(JNIEnv *env,jobject instance, jmethodID func,const char* msg){ //获得一个jstring的对象 jstring javaMsg=(*env)->NewStringUTF(env,msg); //调用updateStatus方法,将jstring作为参数传入 (*env)->CallVoidMethod(env,instance,func,javaMsg); //删除javaMsg的引用 (*env)->DeleteLocalRef(env,javaMsg);}//调用java层的getBuildVersion()函数来获取Android系统的版本//调用java层的getRuntimeMemorySize()函数来获取当前系统运行时内存闲置的空间大小JNIEXPORT void queryRuntimeInfo(JNIEnv *pInterface, jobject pVoid) { //查找到getBuildVersion()方法 jmethodID versionFunc=(*pInterface)->GetStaticMethodID(pInterface,g_ctx.jniHelperClz, "getBuildVersion","()Ljava/lang/String;"); //调用方法获取到版本号 jstring buildVersion=(*pInterface)->CallStaticObjectMethod(pInterface,g_ctx.jniHelperClz, versionFunc); //将jstring的字符串转换为char*类型的字符串 const char *version=(*pInterface)->GetStringUTFChars(pInterface,buildVersion,NULL); //在log中输出版本信息 LOGI("version %s",version); //释放jstring类型的变量 (*pInterface)->ReleaseStringUTFChars(pInterface,buildVersion,version); //删除本地引用 (*pInterface)->DeleteLocalRef(pInterface,buildVersion); //查找getRuntimeMemorySize()函数 jmethodID memFunc=(*pInterface)->GetMethodID(pInterface,g_ctx.jniHelperClz,"getRuntimeMemorySize","()J"); //调用该函数获取内存闲置空间大小 jlong result=(*pInterface)->CallLongMethod(pInterface,pVoid,memFunc); //输出内存闲置空间大小 LOGI("Runtime free memory size: %lld", result); (void)result;}
在代码中出现了一个LOGI函数 这是宏定义的一个函数用于简化在android中输入log信息的参数设置
//需要先引入头文件#include <android/log.h>//设置宏定义#define LOGI(...) \ ((void)__android_log_print(ANDROID_LOG_INFO, kTAG, __VA_ARGS__))还需要在 module:app的build.gradle的ndk标签中加入库的引用 ndk{ moduleName='wbl-jni' toolchain= 'clang' CFlags.addAll(['-Wall']) ldLibs.addAll(['android','log']) //多了这句 }
0 0
- Android Studio NDK 开发之在Native中调用java层的函数
- Android studio 中调用ndk-build 进行编译native 层直接编译
- Android NDK(JNI)学习总结一:Java代码中申明native函数-Java调用C函数,并在C函数中访问java类和方法、属性
- Android NDK- native调用Java
- Android中framework层的cpp文件中调用native层c函数的方法
- 在Android Studio中进行NDK开发的一般流程
- 在Android studio中进行NDK开发
- 在Android studio中进行NDK开发
- 在android的Java层、JNI层、Native C++层都实现了类似的函数,它们是层层向下调用
- Android NDK开发(一)之java层调用C代码浅析
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android NDK 学习之调用Java函数
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- Android NDK 学习之在C中调用Java的变量和静态变量
- android NDK开发中 在native代码试用log
- 基于.net开发chrome核心浏览器【二】
- 在PHP语言中使用JSON
- asm_diskstring
- 测试
- iOS 10 Could not find Developer Disk Image
- Android Studio NDK 开发之在Native中调用java层的函数
- 我的python自学读书计划
- 《汇编语言》学习(二)寄存器
- linux命令~grep
- centos7.2 编译安装lnmp
- VS中vcxpro路径的重新设置
- Java的Class类及static块的执行时机
- 设计模式--Prototype模式
- 标准模板库(STL) map —— 初始化问题