首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

extern C作用

前言 我们用Android Studio新建nativedemo应用,一般C++代码如下,这是一个典型静态注册JNI例子,调用stringFromJNIjava方法会调用到Java_com_kobe_MainActivity_stringFromJNI...4.动态注册JNI接口,就不用担心这个问题,所以不用加extern "C" 进一步思考 很多时候我们会碰到一些头文件声明了C语言函数,但是这个头文件会被C语言或者C++语言使用。...但是C++语言中就会将memset函数修饰成_Z6memsetPvii, 这样子链接器就无法与C库memset链接了,所以必须使用extern "C",但是C语言又不支持extern "C",如果为了兼容...幸好我们有一种很好方法可以解决这个问题,那就是使用C++宏"__cplusplus",我们可以通过这个宏来判断当前编译器是不是c++编译器。...cplusplus) } #endif 这种使用技巧,可以说android源码随处可见,下次看到了应该就知道为什么了吧。

68630

Android开发笔记(六十九)JNI实战

NDK调用第三方C/C++库,因为很多开源库都是用C/C++代码编写,例如:OpenGL,FFmpeg等; 3. 便于移植,用C/C++库可以很方便在其它嵌入式平台上再次使用。...虽然JNI是java平台标准,但要想在Android使用JNI,还得配合NDK才行。 NDK提供了C/C++标准库头文件,以及标准库动态链接文件(主要是.a文件和.so文件)。...而JNI自己工程下面编写JNI接口C/C++代码以及mk编译文件,代码要包含NDK头文件,然后mk文件又依据规则把标准库链接进去,编译通过形成最终so动态库文件。..."); } 3、转到工程jni目录下,c/cpp文件编写C/C++代码。...JNI编码注意事项 下面是本人在实际开发,总结出来几个注意事项(不完整,实际工作持续更新): 1、每个接口必须写在不同c文件,同时要修改Android.mk,LOCAL_SRC_FILES

91040
您找到你想要的搜索结果了吗?
是的
没有找到

AndroidJNI【实战教程】1⃣️--java和c/c++那些事

JNIAndroid和c/c++起着重要作用,就相当于桥梁。你知道抗日时候为啥要先炸桥梁就知道JNI在其中重要性了。...Android,java主要负责UI功能实现,而c/c++则负责完成一些复杂算法及底层交互功能,因此Androidjava和c/c++交互特别的频繁。...所以有的人说android开发就是做java,真的是很可怕想法。 无论Java到c/c++,还是c/c++到java 中间都没有跨线程调用,两者一个线程,只是两者线程id表示不同而已。...堆栈可能引发问题 Dalivk,java和native代码使用不同堆栈,大小也不同,java大小32kb,native大小1MB。 ART,native带啊使用相同堆栈。...Java代码,Thread类构造方法可以制定堆栈大小。

89560

Android IO监控 | 性能监控系列

IOCanary基础上进行二次封装 MatrixIOCanary由于只兼容到Android9版本,所以我们实际使用其实碰到了很多问题。...我们实际使用IOCanary只监控了主线程IO读写操作,并不足矣帮助我们去定位项目内所有IO读写操作,所以我们队其进行了二次开发操作。...c++代码,我们只要简单把几个proxy方法线程检查逻辑屏蔽掉即可。...堆栈打印 MatrixIOCanary,有个IOCanaryJniBridge,这个就是其中jni调用类。他还有另外一个功能,就是把hook到IO操作堆栈进行转化。...总结 作为一个c++菜鸡来说,现在也只是会使用这些hook框架,但是其中原理和如何优化之类,还是一头雾水。

2.6K22

Android JNI出坑指南

Android编程,出于硬件交互,跨平台,安全性,第三方库等方面的考虑,我们需要Java与C/C++互相调用,这就需要借助Java平台JNI接口(Java Native Interface)。...Android早期版本因JNI调用性能,native代码调试困难而被诟病,但近年来性能已经有不错优化,Android NDK对C++开发支持也越来越好,特别是Android Studio上开发调试C...局部引用限于其创建堆栈帧和线程,并且在其创建堆栈帧返回时会自动删除。也就是说一般情况下局部引用会在返回Java方法自己删除。...Google官方JNI指南文档建议Android2.0以上可使用pthread_key,在线程析构自动调用Detach以简化操作。...另外使用jniGetStringUTFChars方法把jstring转换为C++字符串得到字符串编码为Modified UTF8,如果直接传递到服务端或其他使用方,emoji表情将出现解析失败问题

4.3K71

Android内存篇(二)---JVMTIAnroid8.1下使用

前言 上一篇《Android内存篇(一)---使用JVMTI监控应用》已经介绍了AndroidJVMTI内存监控,文章最后我也提到了,虽然代码anroid8.0通过反射开启JVMTI监控,但是项目中代码并不能用...,JNIC++报空指针问题,也是因为自己产品中用Android设备正好是8.1,实际使用时发现这个问题,所以就有了这篇针对Android8,1JVMTI使用 Android8.1运行错误...,是执行了attachInit函数后,输出SetEventCallbacks,下一步是执行完SetEventCallbacks后会输出得到返回值,日志并没有输出反回值,那说明是执行SetEventCallbacks...代码中加入判断mJvmtiEnv是不是空,然后再运行 输出日志上面显示mJvmtiEnv是空,那就找这个指针什么时候赋值,从代码可以看到,是开启JVMTIagent回调给赋值。...捕获OOM方法可以看《Android关于OOM捕获方法》。

56520

JNI探索

JNI概念 定义 JNI是Java Native Interface缩写,通过使用 Java本地接口书写程序,可以确保代码不同平台上方便移植 原理 ?...,有对应着相应签名,如下表格: 这些签名时候接下实例讲解中会用到; 简而言之,jni涉及到类型使用(包括基本类和引用类型) ?...,等于C++里面创建一个java对象,然后进行调用;同样也是采用GetMethodID方法进行获取构造函数id,然后由NewObject 进行对象创建 JNI数组使用 java代码: //整型数据...会阻止GC回收所引用对象,不在本地函数跨函数使用,不能跨线前使用。...: GetFieldID faild "); } } 说明: native调用java方法,java方法抛出异常,我们native检测异常,检测到后抛出native异常,并清理异常

93920

JNI开发,你需要知道一些建议

它们本质上都是指向函数表指针指针(C++版本,它们被定义为类,该类包含一个指向函数表指针,以及一系列可以通过这个函数表间接地访问对应JNI函数成员函数)。...JNIEnv和JavaVMC声明是不同于C++声明。头文件“jni.h”根据它是以C还是以C++模式包含来提供不同类型定义(typedefs,取别名)。...Android当前调用GetStringChars不需要拷贝,而GetStringUTFChars需要一次分配并且转换为UTF-8格式。...注意中断代码抛出异常不会展开Native调用堆栈信息,Android也还不支持C++异常。JNI Throw和ThrowNew指令仅仅是在当前线程中放入一个异常指针。...JNI_OnLoad函数C++写法如下: jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; if (vm->GetEnv

1.4K30

一行代码Android上实现人脸检测、关键点检测、口罩检测

C++实现的人脸检测,人脸关键点检测和戴口罩检测,并将编译好动态库和静态库部署Android应用上,Android设备上实现人脸检测,人脸关键点检测和戴口罩检测,所以本应不会使用C++开发,...可以只使用笔者提供JNI接口实现这些功能。...ai这个module是笔者开发使用,读者使用这个项目,完全可以删除掉,如果是看C++实现,也可以看这个module源码。...facekeypoints.nb这个是人脸关键点检测,检测到人脸之后,通过这个模型检测人脸关键点。maskclassifier.nb这个模型是口罩分类模型,检测到人脸之后,用这个识别是否戴口罩。...com.yeyupiaoling.ai是存放识别功能代码,这个包文件不能修改,因为里面包含了JNI接口,跟C++代码保持一致。PaddleNative.java就是识别的JNI接口。

1.8K20

Android NDK开发基础

(2)ndk-build:可在Android.mk 和 Application.mk文件配置编译选项,ndk-buildC++运行时默认值为none,ndk-build默认停用C++异常,默认停用...CMake使用工具链来执行编译、链接等任务,对不同语言需要使用不同工具链; NDK工具链文件位于 NDK目录 {NDK_root}/build/cmake/android.toolchain.cmake...目录下,新建native_lib.cpp,JNI_OnLoad时调用env->RegisterNatives进行注册(JNI_OnLoad是动态库被加载由系统进行调用): // 需要注册jni方法所在类...; 对于native代码通过pthread_create() 或 std::thread 启动线程,是没有JNIEnv,也就无法调用JNI,可以使用 AttachCurrentThread()...常见native crash:source.android.com/devices/tec… 当native层发生crash,crash堆栈如下所示: A/libc: Fatal signal 11

1.9K21

Android NDK开发入门

原生C/C++ 库 很多核心 Android 系统组件和服务都是使用C 和 C++ 编写,为了方便开发者调用这些原生库功能,AndroidFramework提供了调用相应API。...C/C++基本类型用typedef重新定义了一个新名字,JNI可以直接访问,如下所示。...比如native访问java.lang.String 对应JNI类型jstring,不能像访问基本数据类型那样使用,因为它是一个Java引用类型,所以本地代码只能通过类似GetStringUTFChars...Java默认是使用Unicode编码,C/C++默认使用UTF编码,所以native层与java层进行字符串交流时候需要进行编码转换。...使用JNI,由于本地代码不能直接通过引用操作JVM内部数据结构,要进行这些操作必须调用相应JNI接口间接操作JVM内部数据内容。

1.6K50

Android开发笔记(七十五)内存泄漏处理

C/C++存在指针概念,程序需要使用指针变量,就从内存开辟一块区域,并把该区域首地址赋值给一个指针,这样程序才可操作该指针指向内存区域。...情况之一是调用了非java接口,比如调用了jni接口,jniC/C++内存就要手工回收;情况之二是调用了外部服务,使用完毕就得手工通知外部服务去回收;情况之三是异步处理,实时内存回收显然顾不上异步处理任务...内存泄漏场景 Android开发,内存泄漏可能发生在如下几个场景: 1、查询操作后,没有关闭游标Cursor; 2、刷新适配器Adapter,没有重用convertView对象; 3、...检查app是否发生内存泄漏,有三个办法: 1、代码定期检查当前进程占用内存大小。...jni介绍参见《Android开发笔记(六十九)JNI实战》。 实测发现,即使recycle也存在内存泄漏,只是没recycle的话泄露有十倍。

1.1K20

Android 逆向之安全防护基本策略

手动动态注册是复写JNI_OnLoad方法,该函数手动注册方法名和对应方法签名,方法名可以自定义,这样避免了静态注册命名规则,让破解者难以根据规律找到要破解方法。...对抗Xposed 原理 Zygote Android系统App进程都是由Zygote进程“孵化”出来。...Zygote进程启动过程,除了会创建一个虚拟机实例之外还会将Java Rumtime加载到进程并注册一些Android核心类JNI(Java Native Interface,Java本地接口...(Native Method) ③ 检查关键Java方法被变为Native JNI方法 当一个Android AppJava方法被莫名其妙地变成了Native JNI方法,则非常有可能被Xposed...由于Xposed Installer通常只能Hook Java层,因此Native层使用C来解析/proc/self/maps文件,搜检App自身加载是否存在XposedBridge.jar、相关

1.3K30

Android NDK开发完全剖析

之前两篇文章主要介绍了音视频SDK线程设计和消息队列,其实对那些想从Android转向音视频开发同学来说,NDK方面的知识是不得不提“前置条件”,因为音视频开发主要是C/C++开发,也许有些同学会反驳...NDK全称是Native Development Kit,是Android上实现C/C++开发工具集,我们Android项目中编写C++代码,然后通过交叉工具将C++代码编译成so,上层使用System.loadLibrary...和上层交互类型标识,不同字符标识不同类型。...reserved); JNI提供了注册so回调方法,就是JNI_OnLoad,JNI_OnLoad回调,可以使用RegisterNatives 注册所有的原生方法。...JNI多线程: 我们经常遇到一个场景是,JNI可能会开启一个线程,如何回调到Java层来?

1.8K10

JNI线程相关

注:Android develop编码建议是: 尽可能避免使用受管理编程语言编写代码与使用 C++ 编写代码之间进行异步通信。这样可使 JNI 接口更易于维护。...例如,最好使用 Java 编程语言两个线程之间进行回调(其中一个线程发出阻塞 C++ 调用,然后阻塞调用完成通知界面线程),而不是通过 JNI使用 Java 代码界面线程调用 C++ 函数。...尽可能减少需要接触 JNI 或被 JNI 接触线程数。如果您确实需要使用 Java 和 C++ 这两种语言线程池,请尽量保持池所有者之间(而不是各个工作器线程之间)进行 JNI 通信。...一种比较常见应用场景是:native 层创建了线程,线程执行完后想将结果返回给java层,这时线程是不能用jni函数参数JNIEnv,因为参数JNIEnv属于不同线程....MediaPlayer object全局引用.u全局引用必须要主动地去释放它,可以猜测到释放地方是JNIMediaPlayerListener析构函数 JNIMediaPlayerListener

1.4K20

深入理解使用ndk-build编译NDK程序

Application.mk: 目的是描述在你应用程序中所需要模块(即静态库或动态库),它也位于 $PROJECT/jni/ 目录。 下面我们分别来详细介绍一下它们。...) 下面我们来分别解释一下每行语句作用: LOCAL_PATH >>Android.mk必须首先定义 LOCAL_PATH 变量,此变量表示源文件开发树位置。...此变量必须保留其值,因为系统单一 GNU Make 执行环境(其中所有变量都是全局解析所有构建控制文件。 描述每个模块之前,必须声明(重新声明)此变量。...该指令可以让您在自己应用中使用或链接替代 C++ 实现。 >``` APP_CFLAGS 构建系统仅构建 C++ 源文件传递到编译器一组 C++ 编译器标志。...构建应用模块使用它来更改优化级别。

3.1K20

Android Crash之Native Crash分析

前言 上一篇给大家介绍了Android CrashJava Crash分析,我们可以知道Java Crash一般会弹出提示框告诉我们程序崩溃了,通常使用Crash工具都能够捕获到;本篇博客来谈谈如何针对...Native CrashAndroid特点 出错界面不会弹出提示框提醒程序崩溃(Android 5.0以下) 出错时会弹出提示框提醒程序崩溃(Android 5.0以上) 程序会直接闪退到系统桌面...这类错误一般是由C++层代码错误引起 绝大部分Crash工具不能够捕获 我们实际Android开发时候,可能会引入第三方一些so库或者自己开发相应so库供程序使用,然而so库一般是通过c或者...上一节我们谈到so库是同通过Native语言开发,自然Android使用so库时候发生Crash,就是我们所说Native Crash。...寄存器快照:进程收到错误信号保存下来寄存器快照,一共有15个寄存器。 堆栈信息:##00表示栈顶,##01调用#00,以此往下都是嵌套调用关系,直至到栈顶。

3.2K60

Android so文件浅析「建议收藏」

大家好,又见面了,我是你们朋友全栈君。 一. 简述 Androidso文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发。 二....Android O上, 对于第三方apk,一般so文件生成nativeLibraryPath是/data/app-lib/XXX/ 下。 b....目前常用使用loadLibrary来动态加载库文件。 五. 扩展知识 1. Android NDK开发 (1).环境搭建 Eclipse环境搭建在网上很多可以搜搜。...(2).简单案例 对于JNI技术来说:主要是java我们定义方法,而在C++实现这个方法,最后再回到java中进行调用。.../jni r.demo.com.ndkdemo.JNIDemo 此时/jni 目录下就会生成:r_demo_com_ndkdemo_JNIDemo.h (3).JNI类型 看我们第二第二步生成c

4.2K11

Android程序,内嵌ELF可执行文件--Android开发C语言混合编程总结

我们就会用到AndroidJNI技术,使用NDK支持,利用C++开发高计算量模块,供给上层Java程序调用。...虽然Java/C++都是面向对象语言,但两者面向对象实现是不同。所以Java某个类方法,转换到C++世界,是使用很长函数名来做区分。...函数只有一条语句,就是返回一个文本字符串,使用JNI中提供NewStringUTF函数把这个C++字符串转换为一个JavaString对象。...所以编译出二进制代码,需要作为数据文件,放入APK资源区。 Java代码,根据检测到CPU类型,把对应可执行文件,从数据区拷贝到Android设备上,并设置为可执行。...JNI则可以使用.so文件,这时候Android.mk,应当使用$(PREBUILT_SHARED_LIBRARY)参量,来说明一个.so预定义动态链接库。

1.8K40
领券