android-NDK基础
Java/C++混合开发
ByteFlys
这个作者很懒,什么都没留下…
展开
-
【NDK】【023】NDK崩溃定位终极方案
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 查看完整错误日志 日志格式分析 解编译,定位源码位置 Addr2line使用方法 使用简化 Addr2line工具独立版原创 2021-07-13 10:41:53 · 972 阅读 · 1 评论 -
【NDK】【022】JNI DETECTED ERROR IN APPLICATION: use of deleted local reference
错误原因通过JNIEnv创建的jobject,大多是局部变量,出了函数作用域后,就不能再被使用了所以一定要将这些变量转为全局变量,再传给外部指针或引用,并且用完要释放正确代码 //char数组转jstring void toString(const char *charArray, jstring &string) { JNIEnv *env = nullptr; bool detached = JNI::jvm->GetEnv((void **) &e原创 2021-07-03 10:24:31 · 2257 阅读 · 0 评论 -
【NDK】【021】Java层回调方法ThreadId不断改变
判断线程的方法安卓有两种区分线程的方法一种是通过AndroidSDK自带的Process.myTid()方法来获取id一种是通过JDK自带的Thread.currentThread().getId()方法来获取id这两个id的命名规则是不同的,但都可以用来区分线程JDK线程判断存在的隐患AndroidSDK自带的Process.myTid()方法,获取到的是Linux系统底层线程的真正idJDK的Thread.currentThread().getId()方法,只是JVM给自己的Thread对原创 2021-06-01 15:17:16 · 513 阅读 · 0 评论 -
【NDK】【020】JNI线程切换、AttachCurrentThread、DetachCurrentThread
JNI线程绑定的普通用法 JNIEnv *env = nullptr; jvm->AttachCurrentThread(&env, nullptr); env->CallVoidMethod(obj, onErrorMethod, -1); jvm->DetachCurrentThread();普通用法的缺陷如果子线程是在C++中创建的,然后通过以上代码来执行Java回调,则没有任何问题但如果子线程是在Java代码中创建的,Java调用了C++代码,C++代码原创 2021-06-15 12:43:36 · 4729 阅读 · 7 评论 -
【NDK】【019】NDK使用cmath库
NDK默认是不链接cmath库的,需要自己手动在CMakeLists或Android.mk里进行配置我这里用的是CMakeLists,配置规则如下 //-Lm表示开启cmath库 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${STATIC_LIBRARY_PATH} -Lm -std=c++11 -frtti -fexceptions") //m表示链接cmath库 target_link_libraries( MediaPlaye原创 2021-07-06 10:57:03 · 595 阅读 · 0 评论 -
【NDK】【018】NDK使用Logcat控制台,JString和C++标准库
注意事项使用Log控制台使用JString使用C++标准库将std::cout重定向到Logcat控制台原创 2020-03-04 00:21:28 · 973 阅读 · 0 评论 -
【NDK】【017】JString转Char数组
JNIEXPORT void JNICALL Java_com_ndk_JNI_native_func(JNIEnv *env, jobject object, jstring str) { const char *pChar= env->GetStringUTFChars(str, 0); env->ReleaseStringUTFChars(str, pChar); }原创 2021-05-14 08:43:57 · 716 阅读 · 1 评论 -
【NDK】【016】添加了a文件和头文件,仍然报undefined reference to xxx
NDK工程中,除了指定a文件的存放位置,还要再指定使用哪些库,两个都不能遗漏原创 2021-08-11 20:53:54 · 776 阅读 · 1 评论 -
【NDK】【015】jni.h file not found
问题1:include文件找不到问题2:include正常,但无法查看源码原创 2021-06-18 07:49:44 · 2534 阅读 · 0 评论 -
【NDK】【014】JNI头文件native_1前缀
Java中的native方法,一般有以下两种命名习惯有的人为了突显native方法,会刻意在native方法前加上native前缀,并采用带有c++色彩的下划线命名法 //初始化JNI开发环境 native void initialize(String tag); //准备播放环境 native void native_prepare(String dataSource); 如果Java方法中本身就带有下划线,那么下划线会被转换为_1 extern "C原创 2021-06-18 14:06:53 · 466 阅读 · 0 评论 -
【NDK】【013】CMakeLists语法详解
在介绍CMakeLists语法前,首先建议大家使用CMakeLists替代Android.mk来进行NDK开发cmake/CMakeLists本来对make/Makefile进行优化后的产物,它的语法更加贴近编程语言,更易读懂 #注意,这不是一个可实际运行的CMakeLists,仅用于演示语法 #里面会有重复定义的变量和模块名,不要觉得奇怪,仅仅是为了演示 #指定cmake最小版本 cmake_minimum_required(VERSION 3.6.0) #设置C++语法标准版本原创 2020-11-25 23:20:29 · 693 阅读 · 0 评论 -
【NDK】【012】Android.mk语法详解
NDK编译使用到Application.mk和Android.mk两个脚本Application.mk用于配置项目的全局选项,如果项目适配的cpuAbi,安卓的platform版本等Android.mk则用于配置具体的代码编译规则mk文件语法的详细介绍,可以参考谷歌的官方文档https://developer.android.google.cn/ndk/guides/application_mk这里简单示范下,常用的Android.mk语法规则 #这并不是一个有效的Makefile文件,仅仅是原创 2020-11-24 00:10:58 · 332 阅读 · 0 评论 -
【NDK】【011】通过CMakeLists编译Native代码为so库
前面我们已经介绍过,通过Gradle/命令行来编译Native代码,通过JNI/JNA来调用Native代码这里我们再介绍一种比较新的方法,Gradle+CMake编译Native代码,很适合从C语言转过来的开发人员原创 2020-05-20 00:37:23 · 551 阅读 · 0 评论 -
【NDK】【010】通过Android.mk编译Native代码为so库
前面我们已经讲解过,如何在Java中使用JNI和DLL,这和在Android中使用JNI和SO原理是完全一致的,流程也相似,只是编译的平台和工具不同如果我们前面都学透了,现在就会很轻松了。下面我们开始讲解,如何在Android中使用JNI安装NDK开发环境Tools - SDK Manager - 安装CMake,NDK,LLDB等组件编写Java调用JNI的接口根据Java接口生成J...原创 2020-02-29 20:05:13 · 833 阅读 · 0 评论 -
【NDK】【009】JNI类型和Java类型对应关系,C++类对象和Java类对象互转
JNI类型和Java类型对应关系Java类型JNI类型真实C++类型booleanjbooleanuint8_t,unsigned charbytejbyteint8_t,signed charcharjcharuint16_t,unsigned shortshortjshortint16_t,shortintjintint32_t,intlongjlongint64_t,long longfloatjfloatfloa原创 2021-06-20 15:07:03 · 655 阅读 · 0 评论 -
【NDK】【008】AndroidStudio自动生成JNI头文件
不同版本的Studio,不同的IDE,生成的jni文件可能略有区别,我的是AndroidStudio-4.1.3原创 2021-04-02 10:14:21 · 381 阅读 · 0 评论 -
【NDK】【007】JNA - UnsatisfiedLinkError - Error looking up function
cpp中的公开方法需要用extern "C"修饰 extern "C" int sum(int a, int b){ return a + b; }extern "C"表示使用C编译器规则编译此方法C编译器在编译时,会保留sum函数原名C++编译器则会编译为类似sum_int_int的格式如果没有声明extern “C”,则在Jna中使用sum作为函数名,是无法找到对应的C++方法的...原创 2020-05-12 00:25:08 · 4919 阅读 · 1 评论 -
【NDK】【006】JNA调用dll动态库,JNA数据类型对应表
<font color='fuchsia' >**什么是JNA**</font> - [ ] JNA全称Java Native Access,是JNI之外另一个Java访问C++的混编框架 - [ ] JNA非Java自带功能,需要导入第三方类库 - [ ] JNA只支持Java调用C++,不支持C++调用Java - [ ] JNA对C++代码和编译无特殊要求,普通的C++代码都可调用,非常方便 - [ ] JNA直接将dll文件加载为一个接口对象,只要定义一个接口,里面包含和C++同名的方原创 2020-02-23 23:01:29 · 1370 阅读 · 0 评论 -
【NDK】【005】dll路径查找规则和加载原理
这篇博客我们主要讲解,Java程序是如何查找dll的根据这个查找规则,我们又该如何去管理dll文件,如何修改软件运行参数Java程序会从哪些地方查找dll文件 当前运行目录:默认为jar包所在目录,或工程代码所在根目录 操作系统环境变量:我们平时配JDK时,path变量中包括的所有位置都会被查找 程序私有环境变量:通过命令行参数,我们可以给程序设置额外的path路径,不与其它程序共享,...原创 2020-02-23 01:10:54 · 404 阅读 · 0 评论 -
【NDK】【004】JNI调用dll动态库
JNI调用C++规则使用IntelliJ Idea和CLion开发JNI源代码原创 2020-02-22 16:05:18 · 846 阅读 · 2 评论 -
【NDK】【003】将C++代码编译为dll共享库
什么是共享库C++代码可以编译成类库,直接分发给其它应用调用,这使得可以很容易地将自己的代码以库文件的形式共享给他人使用,同时还能保护源码不泄漏C++共享库在Windows中以dll文件的形式存在,而在Linux系统中则以so文件的形式存在,这两种文件想必大家都不陌生,其实它们都是C++共享库,只是适用于不同平台的软件,并且都可以被JNI调用将C++代码编译为共享库由于AndroidStu...原创 2020-02-21 09:26:44 · 1344 阅读 · 0 评论 -
【NDK】【002】目标文件,静态库,动态库
目标文件目标文件是由源代码编译而成的二进制文件源代码是供开发者阅读的文本文件,它的体积大,而且本质上都是文本,无法直接被机器使用,所以需要先编译为目标文件一个源代码文件,经过编译就会对应生成一个目标文件静态链接库供主程序代码调用的库文件,在编译时,静态链接库里面的功能都会被打包到主程序里,成为主程序的一部分动态链接库供主程序调用,需要跟随主程序一起发布,到运行时才会被动态调用可执行文件能够被操作系统调用,直接启动一个应用进程的文件关联静态链接库,动态链接库和可执行文件,都是由目标文件链原创 2020-05-16 20:28:24 · 300 阅读 · 0 评论 -
【NDK】【001】JNI和NDK的关系
JNI,全称Java Native Interface,是Java语言本身提供的一套Java和C++之间互调的机制 NDK,全称Android Native Development Kit,是一套用于在Android中方便开发C++动态库开发的工具集 NDK可以根据Java中的native方法,生成对应的C++头文件,也可以根据C++代码,编译出可供Java调用的so库 通过以上分析我们...原创 2020-02-20 22:06:50 · 289 阅读 · 0 评论