二.extern "C"

2023-05-16

extern关键字

xtern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定

一.extern "C"的作用

当它与"C"一起连用时,如:extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,但是函数里面的方法调用还是以C++的方式来调用

二.extern "C"的使用

首先看Hello.h


//防止重复编译的头
#ifndef PRACTICLE_HELLO_H
#define PRACTICLE_HELLO_H

#include <android/log.h>
#include <jni.h>


//文件判断宏定义开头,如果是CPP文件,加入   extern "C" {
#ifdef __cplusplus
extern "C" {
#endif


JNIEXPORT jstring JNICALL
Java_com_example_a2_1opencv_1gray_MainActivity_getHello(JNIEnv *env, jobject instance);




//文件判断宏定义结尾,如果是CPP文件,加入   }  结尾,和前面的    extern "C" {   对应起来
#ifdef __cplusplus
}
#endif

//防止重复编译的头结束标识
#endif //PRACTICLE_HELLO_H

再看Hello.cpp

#include "Hello.h"


#ifdef __cplusplus
extern "C" {
#endif
/**
用C语言格式
return (*env)->NewStringUTF(env, "Hello JNI !");
C++格式
return env->NewStringUTF((char *)"Hello JNI !");

查看源码发现,这两个对象不是一个类型,只是名字一样
#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
typedef _JavaVM JavaVM;
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif
**/

JNIEXPORT jstring JNICALL
Java_com_example_a2_1opencv_1gray_MainActivity_getHello(JNIEnv *env, jobject instance) {
    return env->NewStringUTF((char *) " Hello extern c !");
}

#ifdef __cplusplus
}
#endif


CMakeLists.txt

# 指定cmke版本
cmake_minimum_required(VERSION 3.4.1)
add_definitions(-std=c++11)



add_library(native-lib
        SHARED
        src/main/cpp/Hello.cpp) #添加.c源文件
include_directories(src/main/cpp/include) #添加头文件的位置
target_link_libraries(native-lib
        ${log-lib}) #选择要使用

运行结果:

在这里插入图片描述
code:https://github.com/HumorSmith/NDKPraticle/tree/master/2_ndk_external

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

二.extern "C" 的相关文章

随机推荐

  • ARM:day4

    ARM 的接口技术 裸机编程 例 xff1a LED灯 根据电路图找到 LED 找到控制的管脚 GPX2 7根据芯片手册 找到需要配置的地址空间地址 和使能值写汇编代码 编译工具 arm gcc 安装方式 把 bin 添加到PATH bas
  • ARM:day5

    ARM 的接口技术 串口 UART 工作模式 全双工发送二进制 ASCII码 两个设备通过各自的定时器来接收数据 空闲时拉高电平 要开始发数据时起始位拉低 0 发数据 一般是 8 位带一位校验位 结束发送 拉高电平回到空闲状态 缺点 特点
  • Ubuntu上igraph的安装教程

    暑假终于到了 xff0c 距离上一篇博客应该有3个月的时间了 xff0c 没有学期末的忙忙碌碌 xff0c 接下来会陆陆续续地回顾自己学过的和将学的东西一并整理成博客 关于igraph 因为课程需要 xff0c 在信息资源管理的课程上曾学过
  • 还在按鼠标调试?键盘F1-F10取消Fn快速调试

    传统功能键 xff1a F1 F12媒体功能键 xff1a 音量 xff0c 亮度 xff0c 锁屏 xff0c 飞行模式等 多数电脑 xff0c 或者有些升级为win10的电脑 xff0c 传统功能键变为了媒体功能键 xff0c 开发人员
  • Jupyter Notebook+VSCode环境搭建及原理讲解

    版权所有 xff0c 转载注明原地址 时间 xff1a 2020年1月17日17 33 15 created by xff1a Hpbbs 使用JupyterNotebook编辑 文章目录 0x00 前言 Python命令行模式的单一与Ju
  • Rust 安装,卸载,nightly/stable版本切换(全局或工作空间),提高下载速度

    版权所有 xff0c 转载前注明原址 时间 xff1a 2020年1月26日20 10 44 created by xff1a Hpbbs 文章目录 1 1 安装1 2 卸载1 3 更新1 4 Rust镜像源切换1 5 Rust night
  • Sql to Object VS Sql of Object

    文章目录 Java Object 中的 setter 与 getterLINQ 的定位 xff1a sql to objectSql of Object 的思维提出SQL of object 43 er实现SQLer Java Object
  • Ubuntu 桌面版无网络标识

    Ubuntu 配置网络的方式有两种 xff1a 通过桌面网络标识直接配置通过编辑配置文件配置 xff08 很麻烦 xff0c 而且不方便 xff09 因此 xff0c 下面介绍如何恢复桌面的网络标识 xff0c 以便于后续的网络配置 目录
  • repo sync 会自动切换本地分支与remote 分支的对应---如何自定义这种行为

    日后再写
  • [BugFix] [Android] DownloadManager使用流程问题导致的 下载下来的文件找不到

    DownloadManager使用流程错误导致的无法找到下载完成的文件 1 问题描述2 问题解决3 解决后的思考5 场景利用 1 问题描述 先提交 enqueue 请求 xff0c 后配置 DownloadManager span clas
  • View.post VS Handler.post的区别和使用场景对比

    View post 当对应的Widget View 没有attach到window的时候 xff0c 对应的Runnable会被提交到 ViewRootImpl RunQueue xff0c 如果已经attach的话 xff0c 会提交给U
  • Android 数据库安全:用户退出后,事务回滚日志依然保存有相关的数据信息

    详情 xff1a data data package name databases dday db data data package name databases dday db shm data data package name da
  • 关于IPhone无法收发短信---设置iphone短信中心号码

    这是个人拨打客服所收到解决短信 xff1a 尊敬的客户 xff0c 您好 xff01 如您反映的问题未解决或还有其他手机问题 xff0c 您可直接关注终端服务基地的官方微信公众号 xff1a cmcczdfw xff0c 随时随地获取便捷终
  • UART串口通信

    什么是串行通信 xff1f 将数据字节分成一位一位的形式在一条传输线上逐位地发送 优点 xff1a 成本低 xff0c 控制复杂 什么是异步通信 xff1f 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程 为使双方的
  • CAN总线数据帧

    CAN总线数据帧 1 xff0c 帧起始 xff08 SOF xff09 标识一个数据帧的开始 xff0c 用于帧同步 一个显性位 只有总线在空闲期间节点才能够发送SOF 2 ID 用于确定唯一一条报文 标准帧有11位 xff0c 扩展帧有
  • yolov3算法中关于loss={'yolo_loss': lambda y_true, y_pred: y_pred}的理解

    yolov3算法中关于loss 61 yolo loss lambda y true y pred y pred 的理解 参考文献 xff1a xff08 1 xff09 https www jianshu com p 7e45586c44
  • 【FreeRTOS】内存溢出检测

    Stack overflow detection FreeRTOS官方给了两种内存溢出检测方案 xff1a FreeRTOS stacks and stack overflow checking FreeRTOS is a portable
  • Linux实现简单的udp服务端和客户端(C/C++)

    udp server cpp include lt iostream gt include lt sys types h gt include lt sys socket h gt include lt unistd h gt includ
  • 开源日志库<log4cplus+VS2008使用>整理

    原创作品 xff0c 允许转载 xff0c 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 http pyhcx blog 51cto com 713166 143549 本文出自 碧海笙箫 博客 xff0
  • 二.extern "C"

    extern关键字 xtern可以置于变量或者函数前 xff0c 以标示变量或者函数的定义在别的文件中 xff0c 提示编译器遇到此变量和函数时在其他模块中寻找其定义 此外extern也可用来进行链接指定 一 extern 34 C 34