一、 Java调用C++

C++注册Native方法后,记得在Java类中加载你对应的C++库。

static {
System.loadLibrary(“native-lib”);
}

1.静态注册Native函数

在Java类中声明一个native方法,AndroidStudio就会提醒该方法未定义,把鼠标放上去就会显示生成JNI function:

点击会在native-lib.cpp中自动产生对应的native方法,在方法里面做实现就可以了:

2.动态注册

同样在Java类中声明native方法。
声明后在native-lib.cpp中自己实现该方法。

extern "C" JNICALL void TestJni(){}

实现后注册该方法:

static JNINativeMethod getMethods[] = {{"nativeTestJni","()V",(void*)TestJni},{"nativeGetOffer","()Ljava/lang/String;", reinterpret_cast<void*>(getOffer)},};static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* getMethods,int methodsNum){jclass clazz;//找到声明native方法的类clazz = env->FindClass(className);if(clazz == NULL){return JNI_FALSE;}//注册函数 参数:java类 所要注册的函数数组 注册函数的个数if(env->RegisterNatives(clazz,getMethods,methodsNum) < 0){return JNI_FALSE;}return JNI_TRUE;
}extern "C" jint JNIEXPORT
JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved) {JNIEnv* env = NULL;if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {return -1;}assert(env != NULL);//注册函数 registerNatives ->registerNativeMethods ->env->RegisterNativesconst char* className  = "com/begoit/testjni/MainActivity";if(!registerNativeMethods(env,className,getMethods, sizeof(getMethods)/ sizeof(getMethods[0])))return -1;//返回jni 的版本return JNI_VERSION_1_6;
}

注意:
1、 JNINativeMethod 中第一个参数为要注册的native方法的名字,要与Java类中定义的方法名一致。
2、JNINativeMethod 中第二个参数native方法的参数和返回值,括号里为参数,括号外为返回值。参数可以有多个。Java的类型对应的signature
ava 类型 类型签名

Java 类型 类型签名
boolean Z
byte B
char C
short S
int I
long J
float F
double D
L全限定名;比如String, 其签名为Ljava/lang/util/String;
数组 [类型签名, 比如 [B

3、className 是你要注册的Java类,注意格式。

二、C++调用Java

extern "C"
JNIEXPORT void JNICALL
Java_com_begoit_xiurtcserver_XiuRTCService_OnProcessCameraData(JNIEnv *env, jobject thiz) {// TODO: implement OnProcessData()jclass myClass = env->FindClass("com/begoit/xiurtcserver/CameraProcessor");if (myClass == nullptr) {LOGE("can not find CameraProcessor class");return;}LOGI("find CameraProcessor class");method = env->GetMethodID(myClass, "TestJni", "()V");LOGI("find GetMethodID TestJni");jclass xiurtc = env->GetObjectClass(thiz);LOGI("GetObjectClass XiuRTCService");jfieldID fid = env->GetFieldID(xiurtc, "cameraProcessor","Lcom/begoit/xiurtcserver/CameraProcessor;");LOGI("GetFieldID cameraProcessor");jobject camera = env->GetObjectField(thiz, fid);LOGI("GetObjectField cameraProcessor");env->CallVoidMethod(camera, method);LOGI("CallVoidMethod");
}

说明:
1、我在XiuRTCService类中有一个CameraProcessor 类型的cameraProcessor;
CameraProcessor 中有个函数TestJni。
2、XiuRTCService类中定义的native方法 OnProcessCameraData。

上述函数可以实现 调用XiuRTCService中的cameraProcessor对象的TestJni方法。

AndroidStudio jni C++与Java互相调用相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  2. 本地方法(JNI)——从java 程序中调用C函数

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法--从java 程序中调用C函数 的基础知识 : 2) for source code, ...

  3. jni c java互相调用_通过JNI实现Java和C++的相互调用

    评论 # re: 通过JNI实现Java和C++的相互调用 2008-07-29 14:14 Always BaNg. 不错,把字符转换也一并讲了吧,比如UTF-8的处理,USC-2与MBCS转换等. ...

  4. 如何通过JNI在Java中调用C库函数

    使用Java语言进行开发时,可能由于处理速度.硬件控制或者复用既有的C/C++模块等方面的原因,需要Java层与使用C/C++编写的应用.模块或库进行交互,共同完成某些任务.在两者之间充当连接桥梁作用 ...

  5. Android JNI学习(五)——Java与Native之间如何实现相互调用

    本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...

  6. Java jni 底层_JAVA语言语言调用底层语言的技术JNI解析

    本文主要向大家介绍了JAVA语言语言调用底层语言的技术JNI解析,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. java语言调用底层语言的技术JNI解析. Java代码执行步骤 JN ...

  7. JNI编程 —— 让C 和Java相互调用 - android - 牛蹄印章

    原文地址::http://www.360doc.com/content/11/0427/10/3700464_112638437.shtml JNI其实是Java Native Interface的简 ...

  8. Android系统JNI使用(JAVA调用C语言接口)一

    目录 第一篇:Android系统JNI使用(JAVA调用C语言接口)一 什么是JNI JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信主要是 ...

  9. jni的使用---Java调用c语言

    百度百科: JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植. [1] 从Java1.1开始,JNI标准成为java平台 ...

最新文章

  1. 熬夜之作:一文带你了解Cat分布式监控
  2. AD回收站功能的使用
  3. ZedGraph:一个同时支持WinForm和WebForm的开源图表控件(基于LGPL协议,.NET 2.0 C#源代码)...
  4. s5720找mac 华为交换机_【基础】交换机堆叠模式
  5. 通过七牛云建立私有图床
  6. Matlab----获取一个文件夹下所有文件名
  7. spring(10)通过spring 和 JDBC征服数据库
  8. Apache——Introduction
  9. 论文浅尝 - AAAI2020 | 从异质外部知识库中进行基于图的推理实现常识知识问答...
  10. python获取服务器文件svn版本信息_如何编程获取SVN版本号?
  11. Leetcode:8.string-to-integer-atoi(字符串转整数)
  12. CF888E Maximum Subsequence (Meet in the middle,贪心)
  13. mysql 实现分页的SQL
  14. linux修复u盘的软件下载,修复U盘合集工具
  15. 【阵列信号处理01--基本概念及知识补充】
  16. spyder下载python3.5_spyder python下载
  17. linux常用命令之 解压war包文件
  18. 洛谷P3354 [IOI2005]Riv 河流 题解
  19. USYD悉尼大学DATA1002 OralExam 复习(可能会考的内容)
  20. 五个成人必看的故事!

热门文章

  1. 买了个云服务器怎么使用?只需三步骤就可以建站
  2. 微信小程序——小程序去除文本中的<br>标签
  3. fman后续20210206
  4. PA9题解报告——重名剔除(Deduplicate)
  5. 2023年第47届(第二届)浙江技能大赛网络安全项目 (世赛省选拔赛)A模块解析
  6. php 监控nginx日志文件,Nginx 日志分析及实时监控
  7. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xc0 in position 0: invalid start byte报错解决
  8. linux机器连接sql,在linux下连接MS SQL Server
  9. Dubbo-kubernetes 基于 Informer 服务发现优化之路
  10. 1052 Linked List Sorting (25分)