c jni 调用java_JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
//1.引入Jni头文件
#include #include#include#include
//处理日志打印//------------------------------------日志处理-----------------------------------
#define LOG_TAG "JNILogTag"
//不带格式log
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,"%s",__VA_ARGS__)
//带格式
#define LOG_I(format, ...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,format,__VA_ARGS__)
//2.编写NativeUtils对应的JNI的C/C++函数//------------------------------C/C++函数解释--------------------------------------//JNIEXPORT JNI导出 jstring 函数返回值 JNICALL JNI进行调用//Java_全类名_NativeUtils方法名(JNIEnv *env,jobject jobject)//JNIEnv *env C/C++中的函数指针 jobject jobject 调用Native方法的类对象//------------------------------------sig签名处理-----------------------------------//方式一:命令//生成方法签名的方式:进行生成.class文件的目录下 执行: javap -s xxx.class//方式二:规律 public String JNICallJava(String msg) java层的方法//首先是参数(String msg) ---> (Ljava/lang/String;)//其次返回值 String ----> Ljava/lang/String;//最终签名 (Ljava/lang/String;)Ljava/lang/String;//------------------------常见的转换表------------------------//String Ljava/lang/String;//int I//int[] [I//void V//------------------------------------C/C++调用Java-----------------------------------
extern "C"JNIEXPORTvoidJNICALL
Java_com_aynu_androidjni_NativeUtils_JNICallJavaBack(JNIEnv*env, jobject instance) {//1.得到类的字节码 (调用java方法所在的类 包名+类名)
jclass cls = env->FindClass("com/aynu/androidjni/NativeUtils");//2.获取方法id//clazz 类的字节码 name java方法名称 sig java方法签名
jmethodID mid = env->GetMethodID(cls, "JNICallJava", "(Ljava/lang/String;)V");//3.实例化该类
jobject jobject = env->AllocObject(cls);//5.设置java层参数的值
jstring str = env->NewStringUTF("C/C++ input value");//4.调用java层方法
env->CallVoidMethod(jobject, mid, str);
}extern "C" JNIEXPORT voidJNICALL
Java_com_aynu_androidjni_NativeUtils_JNICallJavaSumBack(JNIEnv*env, jobject instance) {//1.得到类的字节码 (调用java方法所在的类 包名+类名)
jclass cls = env->FindClass("com/aynu/androidjni/NativeUtils");//2.获取方法id//参数解析 jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)//clazz 类的字节码 name java方法名称 sig java方法签名
jmethodID mid = env->GetMethodID(cls, "JNICallJavaSum", "(II)V");//3.实例化该类
jobject jobject = env->AllocObject(cls);//5.设置java层参数的值
jint num1 = 10;
jint num2= 5;//4.调用java层方法
env->CallVoidMethod(jobject, mid, num1, num2);
}extern "C" JNIEXPORT voidJNICALL
Java_com_aynu_androidjni_NativeUtils_JNICallJavaStaticMethodBack(JNIEnv*env, jobject instance) {//1.得到类的字节码 (调用java方法所在的类 包名+类名)
jclass cls = env->FindClass("com/aynu/androidjni/NativeUtils");//2.获取方法id//参数解析 jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)//clazz 类的字节码 name java方法名称 sig java方法签名
jmethodID mid = env->GetStaticMethodID(cls, "JNICallJavaStaticMethod", "()V");//3.实例化该类 该方法为static静态方法 故不需要实例化//jobject jobject = env->AllocObject(cls);//4.调用java层方法
env->CallStaticVoidMethod(cls, mid);
}//------------------------------------Java调用C/C++-----------------------------------
extern "C"JNIEXPORT jintArray JNICALL
Java_com_aynu_androidjni_NativeUtils_JavaCallJNIArr(JNIEnv*env, jobject jobject,
jintArray arr_) {//1.获取arr数组的元素
jint *arr = env->GetIntArrayElements(arr_, NULL);//2.获取arr数组的长度
jsize arrSize = env->GetArrayLength(arr_);//3.遍历数组
for (int i = 0; i < arrSize; ++i) {*(arr + i) += 10;
}//4.释放内存
env->ReleaseIntArrayElements(arr_, arr, 0);//5.返回数组
returnarr_;
}extern "C"JNIEXPORT jint JNICALL
Java_com_aynu_androidjni_NativeUtils_JavaCallJNISum(JNIEnv*env, jobject jobject,
jint num1, jint num2) {//1.相应的逻辑运算
return num1 +num2;
}extern "C"JNIEXPORT jstring JNICALL
Java_com_aynu_androidjni_NativeUtils_JavaCallJNI(JNIEnv*env, jobject jobject) {//3.编写具体的业务逻辑
return env->NewStringUTF("C/C++ Say");
}
c jni 调用java_JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程相关推荐
- jdk11~13支持在线调用本地编译并显示到网页上【Java代码助手】
参考学习 https://www.liaoxuefeng.com/wiki/1252599548343744/1252598088725056#0 按照上面链接下载java文件,内容如下: Learn ...
- java代码中如何嵌入c语言,Android中Java代码与C的互相调用(JNI的简单使用)
引言 最近在做项目的时候,接触到JNI,想一想自己第一次接触这个东西的时候,还是好久之前,现在既然接触到了,那我就简单的跟大家讲一讲JNI的基本使用方法. JNI(Java Native Interf ...
- kotlin 调用java_从Kotlin调用Java代码
Kotlin代码与Java代码完全兼容. Java代码在Kotlin代码中轻松调用,Kotlin代码也可以通过Java代码的正常方式调用. 从Kotlin调用Java代码 从Kotlin文件调用Jav ...
- JNI/NDK开发指南(八)——调用构造方法和父类实例方法
转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中 ...
- AndroidStudio安装及配置 NDK 和 CMake
安装及配置 NDK 和 CMake | Android 开发者 | Android Developers
- android NDK 之cmake的使用
Android NDK 开发(五)AndroidStudio 2.2 NDK的开发环境搭建 标签: androidndkstudio2-2支持ndk开发ndk环境搭建 2016-10-25 14:40 ...
- jni ndk_带有NDK的Android JNI应用程序
jni ndk In this tutorial, we'll be discussing JNI and develop a basic Android Application using NDK ...
- Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)
前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...
- 基于 Android NDK 的学习之旅----- C调用Java
2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...
最新文章
- 第二百二十六天 how can I 坚持
- [C语言] 文件操作,解压华为官方固件UNDATE.APP工具(源代码);
- java 不执行构造函数_函数作为构造函数执行,但不作为函数执行
- 推荐一款多功能时间管理神器
- Zabbix 4.2.5 安装部署实践详解
- 查询oracle历史scn,ORACLE中的各种SCN查询
- Vuex的核心概念state
- redis 配置文件翻译
- cad管线交叉怎么画_CAD命令:打断(BREAK)命令的使用技巧
- Java爬虫入门(一)
- 黑苹果OC引导添加AX200无线网卡驱动
- Windows蓝屏分析
- php paypal网站对接,php 接入 paypal 支付
- 文明与征服北条时宗最强阵容搭配指南
- 论文阅读_无监督知识图对齐PRASE
- 震撼您心灵的四川雪山
- wordpress瀑布流图片主题PhotoBroad模板V2.0
- OSG 之学习二:OSG 模型简单控制
- php 读doc_PHP读取DOC 文件
- 君士坦丁堡升级要点详解
热门文章
- vue spa页面在调用微信jssdk刷新才成功?
- Software--Architecture--SOA Factory
- 为已经存在的用设置表空间
- [转载] python字典更新值_Python–字典元组值更新
- [转载] api地理编码_通过地理编码API使您的数据更有意义
- Ubuntu下添加打印机---之寻找设备lpinfo
- day1-4js算术运算符及类型转化
- 对va_list; va_start ; va_end ;vsprintf理解(转)
- 某考试 T3 sine
- java 改文件名的例子