Android NDK Jni 开发语言使用C和C++的区别

2023-11-02

由于Android官方NDK例子大多使用C语言编写,所以当我们想用C++进行开发时,会出现种种错误。下面简单说说几点不同之处,代码中有部分不同之处:

1.先来一个用C写的例子:

(1)hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)->调用方法且方法中要传入env.

 #include <jni.h>
 
 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {
     return (*env)->NewStringUTF(env,"Hello Jni---->C!");
 }

(2)Android.mk文件,更改后缀名为.c

 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) 
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)

2.再来一个用C++写的例子:

(1)hello.cpp文件。C++中env为一级指针,用env->调用方法,无需传入env;C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern "C"进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名;exter “C”{jni代码}。

  #include <jni.h>
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {
     return env->NewStringUTF("Hello Jni---->C++!");
  }
  #ifdef __cplusplus
 }
#endif

(2)Android.mk文件,更改后缀名为.cpp

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.cpp
 include $(BUILD_SHARED_LIBRARY)

3.Java代码没有差别。

总结:C与 C++开发JNI唯一的区别在于 extern “C”,其实不管是C还是C++, extern "C"都是可以添加上的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK Jni 开发语言使用C和C++的区别 的相关文章

  • Kali 系统基本调试

    目录 前言 实现root登录 方法一 方法二 更新kali系统内核 安装搜狗输入法 安装WPS Firefox 浏览器调优 将 Firefox 浏览器设置为中文 操作如下图 firefox 关闭 success txt 及开启插件安装 更新

随机推荐

  • Java位运算符:Java移位运算符、复合位赋值运算符及位逻辑运算符

    Java 定义的位运算 bitwise operators 直接对整数类型的位进行操作 这些整数类型包括 long int short char 和 byte 位运算符主要用来对操作数二进制的位进行运算 按位运算表示按每个二进制位 bit
  • spring cloud alibaba 组件使用小结

    一 Spring Cloud Alibaba简介 1 1 什么是Spring Cloud Alibaba Spring Cloud Alibaba 是阿里提供的微服务开发一站式解决方案 是阿里巴巴开源中间件与 Spring Cloud 体系
  • [558]python3之数组(array)

    https docs python org 3 5 library array html module array 当我们需要1000万个浮点数的时候 数组 array 的效率要比列表 list 要高得多 因为数组在背后存的并不是float
  • Redis基础篇-03-Redis的数据类型---String(单值单Vlue)

    文章目录 1 简介 2 常用Api可以查阅如下链接分档 3 案例 4 分布式锁 4 1 锁的可靠性 4 2 过期时间设定 4 3 有效期续约 看门狗 4 4 redis分布式锁设计成可重入锁思路 1 简介 String是redis最基本的类
  • SQL语句笔记

    书写顺序 select from where group by having order by limit 基本组成 from 后跟着原表 where 表示在计算前对原表的记录进行筛选 group by 用于分组 在from where g
  • 无刷电机和有刷电机的比较

    如下图 取自硬石电子 下图中左边是有刷电机 右边为无刷电机 无刷电机的一般驱动电路 BLDC 无刷直流电机 和PMSM 永磁同步电机 的区别
  • es6中的generator函数详解

    Generator 函数的定义 语法上 Generator 函数是一个状态机 封装了多个内部状态 形式上 Generator是一个函数 不同于普通函数 是可以暂停执行的 所以函数名之前要加星号 以示区别 整个Generator函数就是一个封
  • 新手学编程必会的100个代码

    这是本文的目录 前言 1 for循环中的else条件 2 数字求和 3 随机数生成 4 将列表中的所有元素作为参数传递给函数 5 获取列表的所有中间元素 6 使用一行代码赋值多个变量 7 Python清空列表 8 通过Enum枚举同一标签或
  • 基本数据类型的包装类

    基本数据类型的包装类 基本数据类型 数值 整数int byte short long 浮点型 float double 字符 char 布尔 boolean java是面向对象的语言 所有的对象都是继承自Object 对象都有属性和方法 但
  • 告别csdn,迁移到自己的博客网站

    一年过去了 懵懵懂懂也学了一些web网安的知识 写了大概60多篇的文章吧 不过自己太懒了 就没放到csdn上 后面干脆自己搭了一个博客网站 用springboot vue写的 当然这里面参考了很多大佬的代码 无论如何 自己也还只是踏入安全圈
  • 实现数组洗牌函数

    我们可能最常使用打乱数组顺序的方法是 Array prototype sort const shuffle list gt list sort x y gt Math random 0 5 但这种方法不是完全随机的 我们可以使用 Fishe
  • Python爬取美女图片案例

    爬虫常规思路 1 分析网页 2 对网页发送请求 获取响应 3 提取解析数据 4 保存数据 本案例所用到的模块 import requests import parsel import os 一 分析网页 分析思路 这个图片网站和别的图片网站
  • linux无法启动oracle数据库,Oracle数据库无法启动?可能是Linux的锅

    近日 在初始化系统的时候 有报错 最后查的是因为部署在一台linux系统上的oracle数据库有异常 登陆到系统中 切换到oracle用户查看数据库状态时 报错现象如下 再查看磁盘空间使用情况df h查看 根目录磁盘空间已经满了 sda3磁
  • 开关电源仿真与设计基于spice 第2版 中译本_电子电路设计SIMetrix / SIMPLIS 8.4介绍及安装教程...

    SIMetrix SIMPLIS 为模拟和电力电子工程师提供专业的电路设计和仿真工具 SIMetrix和SIMPLIS是在SIMetrix开发环境中工作的独立模拟器 可提供原理图输入 波形捕获和内置脚本 SIMetrix是一种混合信号电路模
  • 【Leetcode刷题】算法:罗马数字转整数

    文章目录 一 问题 二 代码理解 一 问题 二 代码理解 class Solution def romanToInt self s str gt int answer 0 length len s d I 1 V 5 X 10 L 50 C
  • Windows小Tips:在终端中优雅使用Vim

    Vim 本是 Linux 系统上一款文本编辑器 它是操作 Linux 的一款利器 程序员熟练使用后效率会显著提升 作为同时Windows的我也希望在Windows如Linux中那般优雅使用Vim Menu 一 将VIM添加至终端 二 将Vi
  • 线性表之顺序存储结构

    线性表是n n 0 个数据类型相同的数据元素组成的有限序列 数据元素之间是一对一的关系 即每个数据元素最多有一个直接前驱和一个直接后继 线性表的顺序存储结构是指在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素 元素之间的逻辑关
  • Vue3学习记录——(1)MVC与MVVM

    1 传统的MVC模式 模型 Model 数据存储 视图 View 用户界面 控制器 Controller 业务逻辑 Model代表数据存储 主要用于实现数据的持久化 View代表用户界面 UI 主要用于实现页面的显示 Controller代
  • wpf自定义控件之依赖属性

    这篇文章的意义是 为wpf自定义控件 定义它的专属属性 这个属性不仅仅可以在c 中使用 也可以在xaml中使用 在xaml中赋值或者绑定 在wpf开发过程中 总会用到格式各样的控件 但是原生控件远远不能满足实际开发的需要 这时候wpf强大之
  • Android NDK Jni 开发语言使用C和C++的区别

    由于Android官方NDK例子大多使用C语言编写 所以当我们想用C 进行开发时 会出现种种错误 下面简单说说几点不同之处 代码中有部分不同之处 1 先来一个用C写的例子 1 hello c文件 在C中没有引用 传递的env是个两级指针 用