首页
学习
活动
专区
圈层
工具
发布

Android NDK开发入门

GetStringUTFChars(str, NULL); if (strFromJava == NULL) { //必须空检查 return NULL;...4.2.2 异常处理 在使用GetStringUTFChars的时候,返回的值可能为NULL,这时需要处理一下,否则继续往下面走的话,使用这个字符串的时候会出现问题.因为调用这个方法时,是拷贝,JVM为新生成的字符串分配内存空间...,当内存空间不够分配的时候就会导致调用失败。...调用Java对象的setAge和getAge方法,获取返回值,打印结果。 删除引用。 NDK错误定位 由于NDK大部分的逻辑是在C/C++完成的,当NDK发生错误某种致命的错误的时候导致APP闪退。...对于这类错误问题是非常不好排查的,比如内存地址访问错误、使用野指针、内存泄露、堆栈溢出等native错误都会导致APP崩溃。 虽然这些NDK错误不好排查,但是我们在NDK错误发生后也不是毫无办法可言。

2.4K50

JNI 从入门到实践,万字爆肝详解!

JNI 要做的只是在两种语言之间做桥接。...该流程用示意图表示如下: 1.3 JNI 的性能误区 JNI 本身本身并不能解决性能问题,错误地使用 JNI 反而可能引入新的性能问题,这些问题都是要注意的: 问题 1 - 跨越 JNI 边界的调用:...以下为 2 种较为常见的转换场景: 1、Java String 对象转换为 C/C++ 字符串: 调用 GetStringUTFChars 函数将一个 jstring 指针转换为一个 UTF-8 的 C...jstring 转换为 C 风格字符串 const char *sStr = env->GetStringUTFChars(jStr, JNI_FALSE); // 释放资源...有 2 种方法: 方法 1: 通过函数返回值错误码,大部分 JNI 函数和库函数都会有特定的返回值来标示错误,例如 -1、NULL 等。在程序流程中可以多检查函数返回值来判断异常。

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

    Android JNI出坑指南

    但调用过程中如果存在循环、递归等调用层次过多的情况,很可能会导致局部引用数量超过局部引用限制导致崩溃。...,会导致线程无法正常退出,有类似错误日志:”thread exiting, not yet detached”,甚至导致VM abort。...在自己创建的线程(类似通过pthread_create)中调用FindClass会失败得到空的返回,从而导致调用失败。...通过jni的NewStringUTF方法把C++的字符串转换为jstring时,如果入参为emoji表情或其他非Modified UTF8编码字符将导致Crash。...另外使用jni的GetStringUTFChars方法把jstring转换为C++字符串时得到的字符串编码为Modified UTF8,如果直接传递到服务端或其他使用方,emoji表情将出现解析失败的问题

    4.7K71

    Java调用native本地方法实例:控制台下的中英文字符对齐问题

    使用JNI调用C/C++实现中英文对齐 JNI,即Java Native Interface,Java本地接口。是Java平台提供的调用本地C/C++代码进行互操作的API。...com.xuetang9.kenny.util.Printer 这里如果出现错误,请检查并重新配置Java的环境变量 获得头文件:com_xuetang9_kenny_util_Printer.h...(jNameField, NULL); //const char * cLevelNameField = env->GetStringUTFChars(jLevelNameField, NULL);...的头文件,jni.h>和jni_md.h>,请大家根据自己机器配置的不同,自行修改路径 2、-m64表示生成64位dll库文件 2.5 在Java中调用本地库文件 书写Java测试类: import...(beauties[i]); } } } 如果直接在Eclipse中运行这个main方法,会抛出异常:java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序

    1.4K30

    Java调用native本地方法实例:控制台下的中英文字符对齐问题

    二、使用JNI调用C/C++实现中英文对齐 JNI,即Java Native Interface,Java本地接口。是Java平台提供的调用本地C/C++代码进行互操作的API。...这里如果出现错误,请检查并重新配置Java的环境变量 获得头文件:com_xuetang9_kenny_util_Printer.h 头文件以包名_方法名的方式命名,内容如下: /* DO NOT EDIT...(jNameField, NULL); //const char * cLevelNameField = env->GetStringUTFChars(jLevelNameField, NULL...的头文件,jni.h>和jni_md.h>,请大家根据自己机器配置的不同,自行修改路径 2、-m64表示生成64位dll库文件 2.5 在Java中调用本地库文件 书写Java测试类: import...i]); } } } 如果直接在Eclipse中运行这个main方法,会抛出异常:java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序

    1K10

    Java调用CC++那些事(JNI)

    C/C++代码的内存不被JVM管理,不注意的话会出现内存泄漏的情况综上,Java调用C/C++的本地代码有一定优势的。本文主要介绍Java提供的,最常用的方式,也就是基于JNI的方式。...#include jni.h>防止重复包含:使用预处理器指令防止头文件被多次包含,确保编译时不会出现重复定义的问题。...输入字符串将Java字符串转换为C字符串GetStringUTFChars: 这是一个JNI函数,用于将Java字符串(jstring)转换为UTF-8编码的C字符串(const char *)。...return 0: 如果内存不足,返回0作为错误码。...调用已有C/C++代码库对于已有代码库,有几种方式可以调用:JNI代码作为桥接程序,和已有的本地代码的源码一起编译成一个动态链接库JNI代码作为桥接程序编译成一个动态链接库,已有本地代码提供另外的动态链接库第一种方式实际上和上面代码示例差别不大

    3.7K00

    Android NDK开发中快速定位crash(五)

    前言 我们在项目开发过程中可能会因为考虑不周或者对象,变量,方法使用不当导致程序产生bug,严重的时候会导致程序崩溃无法用。...当我们的Android程序crash的时候,我们可以通过Android studio logcat等工具快速定位等crach产生位置 如下图: [y8pr0a00yq.png] 是因为textview空指针问题导致等...但是在 NDK 项目开发中,在 C/C++ SDK 出现 crash 的的时候。...如下图:通过搜索 logcat 抓到的日志,只能定位到图中 哪个pid 进程 ID ,tid 线程 ID 出现了问题,开发者无法直观的排查错误原因 [8qdiciva4a.png] 使用ndk-stack...2.然后在java层调用传入空值: [image.png] 3.最后在Terminal中入命令 adb logcat | /Users/pj1053/Library/Android/sdk/ndk-bundle

    3K51

    「音视频直播技术」JNI编程常见问题

    扩展检查 JNI几乎没有错误检查,错误通常会导致崩溃。Android提供了一种称为CheckJNI的模式,在调用标准实现之前,将JavaVM和JNIEnv函数表指针切换到执行扩展系列检查的函数表。...错误的指针:将一个坏的jarray/jclass/jobject/jstring传递给JNI调用,或者传递一个NULL指针到一个不可空参数的JNI调用。...jmethodIDs:在进行调用时,使用错误的jmethodID方法做JNI调用:不正确的返回类型,静态/非静态不匹配,错误类型为'this'(非静态调用)或错误类(用于静态调用)。...这可能导致依赖于设备上不存在的函数或库。...对于显式注册,输入方法签名时会出现较小的错误。确保您传递到registration 调用的内容与日志文件中的签名相匹配。记住'B'是字节,'Z'是布尔值。

    2.2K20

    Android JNI(一)——NDK与JNI基础

    大纲.png 一、导读 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK。...你可以从Google官方查阅到有许多关于SDK的优秀书籍、文章作为参考,但是Google提供的NDK资源,相对于SDK还是比较少的。...我们知道Android的SDK主要是基于Java的,所以导致了在用Android SDK进行开发的工程师们都必须使用Java语言。...总之,在Android的SDK之外,有一个工具就是NDK,用于进行C/C++的开发。一般情况,是用NDK工具把C/C++编译为.co文件,然后在Java中调用。...,JNI的主要竞争优势在于:它在设计之初就确保了二进制的兼容性,JNI编写的应用程序兼容性以及其再某些具体平台上的Java虚拟机兼容性(当谈及JNI时,这里并不特比针对Davik虚拟机,JNI适用于所有

    8.8K32

    Android 编译C++

    ,意思是创建一个配置为使用jni的空活动的新项目。...创建工程出现问题了,这里的错误意思是在Android Studio中使用SDK管理器安装缺少的组件cmake 3.18.1。...勾选上这个需要的版本,点击Apply,然后出现弹窗提示,点击OK,之后就是下载了。 下载完点击Finish,在回到SDK管理窗口点击Apply,最后看到工程窗口,并没有自动去编译。...jstring,这是一个数据类型,是 Java中String数据类型在 JNI 中的代表,宏JNICALL 右边是空的,说明只是个空定义,空定义是可以去掉的,我们试一下去掉再运行,如下图所示: Java_com_llw_studynative_MainActivity_stringFromJNI...③ JNI数据类型   前面说到jstring表示Java中的String类型,那么其他的数据类型在JNI中怎么表示呢,进入jni.h,找到最上方的位置,我们可以看到一些数据类型的定义。

    2.3K50

    【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通

    Android中的应用程序框架 正常情况下的Android框架 : 最顶层是Android的应用程序代码, 上层的应用层 和 应用框架层 主要是Java代码, 中间有一层的Framework框架层代码是...指针 * * 参数介绍 : * env : 代表Java环境, 通过这个环境可以调用Java中的方法 * thiz : 代表调用JNI方法的对象, 即MainActivity对象 */ jstring...source字符串 添加到dest字符串后面 return (*env)->NewStringUTF(env, strcat(p, append)); } -- 如果没有强转会出现下面的错误...: char *p = Jstring2CStr(env, str); -- 将Jstring2CStr方法定义在主方法下面会出现下面错误 :  Java源码 : ...= NULL) tag = env->GetStringUTFChars(tagObj, NULL); //调用JNI函数 msg = env->GetStringUTFChars

    4K11
    领券