//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代码流程相关推荐

  1. jdk11~13支持在线调用本地编译并显示到网页上【Java代码助手】

    参考学习 https://www.liaoxuefeng.com/wiki/1252599548343744/1252598088725056#0 按照上面链接下载java文件,内容如下: Learn ...

  2. java代码中如何嵌入c语言,Android中Java代码与C的互相调用(JNI的简单使用)

    引言 最近在做项目的时候,接触到JNI,想一想自己第一次接触这个东西的时候,还是好久之前,现在既然接触到了,那我就简单的跟大家讲一讲JNI的基本使用方法. JNI(Java Native Interf ...

  3. kotlin 调用java_从Kotlin调用Java代码

    Kotlin代码与Java代码完全兼容. Java代码在Kotlin代码中轻松调用,Kotlin代码也可以通过Java代码的正常方式调用. 从Kotlin调用Java代码 从Kotlin文件调用Jav ...

  4. JNI/NDK开发指南(八)——调用构造方法和父类实例方法

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中 ...

  5. AndroidStudio安装及配置 NDK 和 CMake

    安装及配置 NDK 和 CMake  |  Android 开发者  |  Android Developers

  6. android NDK 之cmake的使用

    Android NDK 开发(五)AndroidStudio 2.2 NDK的开发环境搭建 标签: androidndkstudio2-2支持ndk开发ndk环境搭建 2016-10-25 14:40 ...

  7. jni ndk_带有NDK的Android JNI应用程序

    jni ndk In this tutorial, we'll be discussing JNI and develop a basic Android Application using NDK ...

  8. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

  9. 基于 Android NDK 的学习之旅----- C调用Java

    2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...

最新文章

  1. 第二百二十六天 how can I 坚持
  2. [C语言] 文件操作,解压华为官方固件UNDATE.APP工具(源代码);
  3. java 不执行构造函数_函数作为构造函数执行,但不作为函数执行
  4. 推荐一款多功能时间管理神器
  5. Zabbix 4.2.5 安装部署实践详解
  6. 查询oracle历史scn,ORACLE中的各种SCN查询
  7. Vuex的核心概念state
  8. redis 配置文件翻译
  9. cad管线交叉怎么画_CAD命令:打断(BREAK)命令的使用技巧
  10. Java爬虫入门(一)
  11. 黑苹果OC引导添加AX200无线网卡驱动
  12. Windows蓝屏分析
  13. php paypal网站对接,php 接入 paypal 支付
  14. 文明与征服北条时宗最强阵容搭配指南
  15. 论文阅读_无监督知识图对齐PRASE
  16. 震撼您心灵的四川雪山
  17. wordpress瀑布流图片主题PhotoBroad模板V2.0
  18. OSG 之学习二:OSG 模型简单控制
  19. php 读doc_PHP读取DOC 文件
  20. 君士坦丁堡升级要点详解

热门文章

  1. vue spa页面在调用微信jssdk刷新才成功?
  2. Software--Architecture--SOA Factory
  3. 为已经存在的用设置表空间
  4. [转载] python字典更新值_Python–字典元组值更新
  5. [转载] api地理编码_通过地理编码API使您的数据更有意义
  6. Ubuntu下添加打印机---之寻找设备lpinfo
  7. day1-4js算术运算符及类型转化
  8. 对va_list; va_start ; va_end ;vsprintf理解(转)
  9. 某考试 T3 sine
  10. java 改文件名的例子