JNI

JNI中jstring 与 const char* 相互转换函数

旧巷老猫 提交于 2020-05-06 09:49:12
在平时的工作,经常用到jni和const类型转换。 //将const char类型转换成jstring类型 jstring CStr2Jstring( JNIEnv* env, const char* pat ) { //定义java String类 strClass jclass strClass = (env)->FindClass("Ljava/lang/String;"); //获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); //建立byte数组 jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat)); //将char* 转换为byte数组 (env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat); //设置String, 保存语言类型,用于byte数组转换至String时的参数 jstring encoding = (env)->NewStringUTF("GB2312");

jni补充和异常处理

二次信任 提交于 2020-04-14 01:58:58
【今日推荐】:为什么一到面试就懵逼!>>> 前面基本总结了常见的一些情况,包括对数组,字符串,对象的处理,基本上满足了效果。 具体的例子都在 https://git.oschina.net/xpbob/jni.git 我用的环境是mingw,环境变了的话,就修改makefile吧 我还有没总结的部分:异常处理 异常处理其实和java对象处理差不多,你可以选择先new一个异常,然后调用throw方法 也可以通过throwNew这个方法,简单易用,只需要传递jclass和信息就行,推荐大家使用 我感觉写代码还是各自有各自的流程处理,java和c++的交互只在获取值和返回值的时候最好。 这里再说点细节: 类引用只在本地方法返回时有效,不要全局保存。但是java还提供了newGlobalRef来锁定,用完后调用deleteGlobalRef去除引用,但是这在设计上感觉并不是很好的方法,我建议还是需要的时候再获取一个吧。 关于文件: java都是大端,英特尔架构cpu基本是小端,arm架构cpu基本是大端,用c++读取java文件时,只要不是char(这里的char就是java里的byte),必须考虑字节的翻转。 来源: oschina 链接: https://my.oschina.net/u/1463652/blog/601251

使用libjpeg进行图片压缩

空扰寡人 提交于 2020-04-07 21:26:25
简介 由于工作原因,boss下达的任务就大概说了对图片进行压缩寻找比较合理的方式,还举了一个项目中的坑,就是系统原生的Bitmap.compress设置质量参数为100生成图片会变大的坑。所以我打算用一点时间研究研究Bitmap在内存和外存中的情况。首先需要对图片进行压缩,大家都知道图片是Android里面一个大坑,具体的问题有: OOM,一不留神就用OOM来冲冲喜,所以网上就有了很多解决oom问题的建议,但是由于网友的水平不一也导致建议参差不齐。(内存) 图片压缩再加载失真严重,或者压缩率不够达不到项目要求的效果。(外存) 那我今天就要解决的就是通过今天查阅的资料和自己的判断,还有实践归档一下图片在Android上的问题。并且给出自己解决图片压缩问题的解决方案和实际操作。 1、为什么Android上的图片就不如IOS上的? libjpeg是广泛使用的开源JPEG图像库,安卓也依赖libjpeg来压缩图片。但是安卓并不是直接封装的libjpeg,而是基于了另一个叫Skia的开源项目来作为的图像处理引擎。Skia是谷歌自己维护着的一个大而全的引擎,各种图像处理功能均在其中予以实现,并且广泛的应用于谷歌自己和其它公司的产品中(如:Chrome、Firefox、 Android等)。Skia对libjpeg进行了良好的封装,基于这个引擎可以很方便为操作系统、浏览器等开发图像处理功能。

Android—Camera Framework C/S架构服务请求

一个人想着一个人 提交于 2020-04-06 17:34:47
在前一篇文章 Camera Client/Server的binder IPC机制 中阐述了Android进程间通信binder IPC机制基础,Android Camera基于这个基础设计了Camera Framework Client/Server架构,文中给出了其类图设计。本文从Android 4.4 版本源码入手,分析Camera App向Camera Service请求服务与返回的过程。服务请求的过程从上到下依次要经过三个大的过程:1. Camera App调用Framework Camera类Java API;2. Camera类Java API通过JNI调用JNI层的C++接口函数;3. 基于binder通信设计的Camera IPC通信过程。下面结合代码分析整个服务请求过程。 Camera应用调用Framework Camera类API 在Android Kitkat原生Camera2应用(packages/apps/Camera2/)的PhotoModule, VideoModule, WideAnglePanoramaModule类中用CameraUtil.open()方法来打开Camera。然后依次调用:CameraHolder的open()方法,AndroidCameraManagerImpl的cameraOpen()方法

Android的Camera架构介绍

拥有回忆 提交于 2020-04-06 13:45:05
第一部分 Camera概述 Android的Camera包含取景器(viewfinder)和拍摄照片的功能。目前Android发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。 以开源的Android为例,Camera的代码主要在以下的目录中: Camera的JAVA程序的路径: packages/apps/Camera/src/com/android/camera/ 在其中Camera.java是主要实现的文件 frameworks/base/core/java/android/hardware/Camera.java 这个类是和JNI中定义的类是一个,有些方法通过JNI的方式调用本地代码得到,有些方法自己实现。 Camera的JAVA本地调用部分(JNI): frameworks/base/core/jni/android_hardware_Camera.cpp 这部分内容编译成为目标是libandroid_runtime.so。 主要的头文件在以下的目录中: frameworks/base/include/ui/ Camera底层库在以下的目录中: frameworks/base/libs/ui/ 这部分的内容被编译成库libui.so。 Camera服务部分: frameworks

android JNI 使用 for mac

人盡茶涼 提交于 2020-03-26 11:55:50
3 月,跳不动了?>>> 使用jni实现Java调用C代码,步骤: 1,下载ndk,链接: http://developer.android.com/tools/sdk/ndk/index.html ;解压 , 2,如果是windows系统,需要安装Cygwin工具,这是window下模拟Linux编译环境的工具(因为Android内核就是Linux);如果windows系统的同学就去找安装这个工具的教程; 3,如果是Linux系统或者mac系统,就直接配置NDK环境变量(我是mac系统,在这里就介绍mac系统的了),和配置adb环境变量一样,将ndk解压路劲加入到环境变量文件中,然后在终端中就可以直接编译了; 4,创建一个Android project,在.java文件中定义一个native方法: public native String fromeC(); 5,在项目根目录下创建一个jni文件夹,在这个文件夹下创建一个.c文件,用来实现我们定义的native方法;代码如下: #include <jni.h> #include <stdio.h> /* * 把Java的方法跟C的方法做个对应,一定要符合这些命名规则,才能java才能找到对应的c代码 * type:Java * PackageName:com_baiyou_mp3ecode 这个类所在的包 * ClassName:

【Java的JNI快速学习教程】

笑着哭i 提交于 2020-03-23 05:33:18
1. JNI简介   JNI是Java Native Interface的英文缩写,意为Java本地接口。   问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究)。   解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发。 2. JNI快速学习教程 2.1 问题:   使用JNI写一段代码,实现string_Java_Test_helloworld(JNIEnv *env, jclass cls , jstring j_str)函数,实现在字符串j_str("world")前面加上hello,并返回。 2.2 解决问题过程:   I. 编写Test.java类: 1 public class Test{ 2 // native interface 3 public native String helloworld(String text); 4 5 public static void main(String[] args){ 6 // Load dynamic library 7 System.loadLibrary("Test2"); 8 Test ts = new Test(); 9 String text =

Android JNI&NDK编程小结及建议

丶灬走出姿态 提交于 2020-03-23 05:31:23
前言 由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令、JNI数据类型、签名等,便于查阅相关资料。文末相关参考资料比较适合刚接触或者不熟悉Android NDK开发的朋友参阅。 常用命令 javac 编译java源文件生成.class文件 由于JNI对应的头文件由javah工具根据对应的.class文件生成,所以在进行JNI编程之前,写好Java代码后需要先编译,在使用javah生成对应的头文件 javah -jni自动生成头文件 举例说明: 生成普通的JNI头文件 javah -classpath path -jni -d outputdirpath com.mrljdx.JavaNativeCode 在Java函数中包含Android相关的参数代码,则需要在classpath中添加android.jar包的绝对路径地址 javah -classpath path:$ANDROID_HOME/path/android.jar -jni -d outputdirpath com.mrljdx.JavaNativeCodeWithAndroid javap -s -p 查看函数签名 -s: 显示签名(只显示public类型的签名) -p:显示所有函数

AOSP抽离miracast功能

北战南征 提交于 2020-03-20 13:28:30
最近一周用ndk编译aosp miracast功能,因为代码依赖原因,prebuild aosp原生so; 因为N之后限制了调用系统so,通过白名单机制开源绕过so限制。 今天遇到jni_onLoad无法调用问题,调试半天才发现jni_onload被包含在namespace android里面; 导致java无法调用到; 回调对象使用时,报null pointer derefence;一直以为是对象被提前释放;结果是jvm虚拟机对象没被保存,导致 findEnv crash; 但是Backtrace一直显示 回调函数crash;误导了一个晚上 来源: 51CTO 作者: lindt 链接: https://blog.51cto.com/lindt/2480228

RSA算法的JNI封装思路

ⅰ亾dé卋堺 提交于 2020-03-20 11:03:53
JNI(Java Native Interface)是一组API和标准,作用是实现Java和其他语言(主要是C/C++)的通信。出于运算速度等方面的考虑,一些对运算性能要求较高的算法往往是基于C/C++语言(与硬件关联性更强)实现的。如果应用程序需要基于JAVA编程实现时,这就会有一些矛盾。此时,通过JNI技术,Java开发者可以在不了解算法内容的情况下,方便快捷的使用C/C++加密算法的动态库,实现跨语言调用。例如有如下的应用场景:嵌入式终端要基于RSA非对称算法完成与服务器之间的身份认证。终端通过加入加密芯片,可以快速安全实现基于RSA算法的签名验签工作,但是服务器端往往不会外加加密模块,往往会基于Openssl等开源库来移植RSA算法,进而实现高效运算的目的。这些库源码大多基于C语言实现,此时Java开发者就可以借助JNI技术来封装实现签名等功能。 封装步骤如下: 1、使用java编译器生成调用RSA 加解密,签名验签的API头文件。 2、根据生成的头文件和RSA的C源码库开源库,生成一个供JNI接口调用的静态库 3、在JAVA源码中使用Native方法引入动态库的API,编译java程序 最终生成的文件结构如下图: 注意事项: 1、Java数据类型和本地数据类型需要做适当的转换,对应关系如下表: 2、若在windows下直接使用命令行的形式,注意JDK的版本