通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.UnsatisfiedLinkError异常,找不到XX方法的提示.现在我们想想,在Java中调用某个native方法时,JVM是通过什么方式,能正确的找到动态库中C/C++实现的那个native函数呢? JVM查找native方法有两种方式: 1> 按照JNI规范的命名规则 2> 调用JNI提供的Regist…
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41759643 相信很多做过Java或Android开发的朋友经常会接触到JNI方面的技术,由其做过Android的朋友,为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C或C++)来实现,然后打包成so动态库文件,并提供Java接口供应用层调用,这么做的目的主要就是为了提供应用的安全性,防止被反编译后被不法分子分析应用的逻辑.当然打包成so也不能说完全安全了,只是相对反编译Jav…
转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当我们在调用一个Java native方法的时候.方法中的參数是怎样传递给C/C++本地函数中的呢?Java方法中的參数与C/C++函数中的參数.它们之间是怎么转换的呢?我猜你应该也有相关的疑虑吧.咱们先来看一个样例.还是以HelloWorld为例: HelloWorld.java: package com.study.jnilearn; class MyClass {}…
转载请注明出处:http://blog.csdn.net/xyang81/article/details/42066665 从第三章中能够看出JNI中的基本类型和Java中的基本类型都是一一相应的,接下来先看一下JNI的基本类型定义: typedef unsigned char jboolean; typedef unsigned short jchar; typedef short jshort; typedef float jfloat; typedef double jdouble; ty…
转载请注明出处:http://blog.csdn.net/xyang81/article/details/41777471 JNI全称是Java Native Interface(Java本地接口)单词首字母的缩写,本地接口就是指用C和C++开发的接口.由于JNI是JVM规范中的一部份,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行.同时,这个特性使我们可以复用以前用C/C++写的大量代码. 开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编…
转载请注明出处:http://blog.csdn.net/xyang81/article/details/44279725 在前面几章我们学习到了.在Java中声明一个native方法,然后生成本地接口的函数原型声明.再用C/C++实现这些函数,并生成相应平台的动态共享库放到Java程序的类路径下.最后在Java程序中调用声明的native方法就间接的调用到了C/C++编写的函数了.在C/C++中写的程序能够避开JVM的内存开销过大的限制.处理高性能的计算.调用系统服务等功能. 同一时候也学习到…
转自:http://blog.csdn.net/xyang81/article/details/44657385   这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景和注意事项.可能看起来有点枯燥,但引用是在JNI中最容易出错的一个点,如果使用不当,容易使程序造成内存溢出,程序崩溃等现象.所以讲得比较细,有些地方看起来可能比较啰嗦,还请轻啪!<Android JNI局部引用表溢出:local reference table overflow (max=512)>这篇文章是一个J…
1.生成动态库.so,存放于手机的system/lib/中(APP怎样将.so存入该文件夹,奇怪?????),Java层调用JNI的类会运行静态代码System.loadLibrary("***")将手机的system/lib文件夹中的动态库载入到VM. 2..so动态库里,C组件开发人员通过JNI_OnUnload()函数进行初始化.当然.老版的JNI是没有JNI_OnUnload()函数的,从而VM也能依据有无该函数推断JNI是新版or老版. 3.JNI_OnUnload()函数还…
JNI/NDK开发指南:http://blog.csdn.net/xyang81/article/details/41759643…
公司的新需求终于解决完了,离测试和发布还有段时间,第一次体验了下没需求没bug的感觉,真是舒爽~然后翻了翻有什么可以学的.无意翻到了Android后期发展的五大趋势.一.性能优化.二.高级UI.三.JNI/NDK开发.四.架构师.五.RN开发.这也许将会是我的进阶趋势.早已知道在瓶颈期的我,似乎看到了突破的希望的.初级进阶中级也好,中级进阶高级也罢,现在的市场无非是根据经验规定的,根据能力的少之又少. 其实,关注我的或者在群里的小伙伴也知道,UI那块我问题不大.但是高级UI就有难度了.我们先不管…
之前写过一篇比较水的文章Android手机控制电脑撸出HelloWorld 里面用到了JNI/NDK技术. 这篇文章给大家介绍下JNI/NDK开发.采用的是Android Studio2.2开发环境,使用CMake方式进行开发. JNI(Java Native Interface)是java与C/C++进行通信的一种技术,使用JNI技术,可以java调用C/C++的函数对象等等,Android中的Framework层与Native层就是采用的JNI技术. 我们知道,Android系统是基于lin…
android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中的问题和开发流程 首先.Jni我的理解,属于一个中间的东西,如果把只做linux 的话,他就是linux的应用程序,但是如果做安卓的话,它就是中间层了(用于java语言调用C语言的接口).我们说说 开发JNI的开发环境的搭建吧. 第一:我们用windows平台开发 准备工作: 1.我们安卓开发都需要…
ReadHub项目Kotlin版转换指南(一.环境搭建) ReadHub项目Kotlin版转换指南(二.数据库和网络请求) ReadHub项目Kotlin版转换指南(三.MVP架构) Android 开发中的 MVP 架构相信大家都已经熟悉,不熟悉的请右转 Google,ReadHub 项目从 Java 转换成 Kotlin 过程中,我们需要一套新的架构方式来实现(Kotlin 项目中没有使用 dagger2). base 为 MVP 架构的基础部分,user 为其具体使用过程. base Ba…
  治疗拖延症的唯一办法就是:一想起些什么 / 要做些什么就 TM 立马去做! 是的,突然想起我不会 JNI.NDK 开发.解决办法:立马去学! 一:配置 NDK 环境 下载 NDK 写入到配置文件 二:理解分层 三部分: Java 上层 JNI 桥梁 底层(C or C++) 三:代码开发(以一个计算器为 DEMO) Java 上层定义好native方法: 1 2 3 4 5 6 7 8 9 public class CalculatorHelper { static { System.loa…
早就知道Java有个jni可以调用本地化代码,一直没有动力去研究它,现在公司想通过在Android中调用本地化代码来申请较多的内存以突破Android对单个进程的内存限制,这确实是可行的:我的Nexus4内存2G,Android限制每个进程64M内存,而我用NDK写代码申请到了1,276,641,280字节.在学NDK开发的过程中遇到了各种问题,现在我将在解决问题过程中收集到的一些链接贴出来以助后人. android NDK与Cygwin配置 ndk不大,只有400多M:Cygwin很大,全选有…
https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https://android.googlesource.com/platform/ndk/+/4e159d95ebf23b5f72bb707b0cb1518ef96b3d03/docs/ANDROID-MK.TXT https://android.googlesource.com/platform/ndk/+/4…
Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供Java层调用;另外,就拿Android系统中的Service来说,很多的Service都有java层代码和native层代码组成,native层代码会在android启动的过程中完成向java层的注册.总之,由于无法甩开jni的身影,所以我打算花点时间系统的学习下Android下的jni开发. 一.开发工具 所谓工欲善其事,必先利其器,在学习android系统的jni编程…
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错…
一.数据类型映射概述 从我们开始jni编程起,就不可能避开函数的参数与返回值的问题.java语言的数据类型和c/c++有很多不同的地方,所以我们必须考虑当在java层调用c/c++函数时,怎么正确的把java的参数传给c/c++函数,怎么正确的从c/c++函数获取正确的函数返回值:反之,当我们在c/c++中使用java的方法或属性时,如何确保数据类型能正确的在java和c/c++之间转换. 回顾我们上一篇文章中的那个c函数: #include <stdio.h> #include <jn…
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部分的实际开发知识,基本上掌握这些就可以做一个基本的NDK开发了,但是光是了解Java回调C层的数据是不是还不够啊,考虑问题要考虑可逆性,Java能回调C,那么C能否反过来回调Java呢?答案是肯定可以的,这篇博客就介绍一个C语言如何调用Java层的代码.以下是一些问题场景,我们带着这个问题场景来分析…
一.强类型语言和弱类型语言: 1.1 强类型语言 强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java..net .Python.C++等语言. 强类型包含两个方面: (1)所有变量必须先声明.后使用 (2)指定类型的变量只能接受类型与之匹配的值 举个例子:定义了一个整数,如果不进行强制的类型转换,则不可以将该整数转化为字符串. 1.2 弱类型语言 弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据…
总结: 搜索backtrace  然后: $ /d/android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-addr2line.exe -e /e/devel/tools/androidProjects/JniDemux/app/src/main/obj/local/armeabi-v7a/libjnimedia.so 0006494fe:\de…
不好意思各位,我按照网上一些教程进行JNI开发,折腾了半天也没成功,最后自己瞎搞搞定了,其实超简单的,网上的教程应该过时了,最新版的AS就包含了NDK编译的功能,完全不用手动javah,各种包名路径的配置,超简单,跟我来看看吧! 1.安装java和android-sdk,代理填写android-mirror.bugly.qq.com:8080,下载插件速度快的不要不要的,感谢一下马大爷. 2.下载AS 2.2.2这个版本(下载地址与第3部分NDK合并),貌似包含了代理,反正不用设置就可以访问下载…
原文网址:http://blog.csdn.net/conowen/article/details/7521340 ******************************************************************************************** * author:conowen@大钟                                                                                …
1.JNI简介 JNI全称为Java Native Interface(Java本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互.并非从Android发布才引入JNI的概念的. 2.JNI与NDK 简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用.而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库…
1. 在Android的Java层实现文件的读写操作是非常简单的,可以参看之前写的博文:http://blog.csdn.net/conowen/article/details/7296121 在JNI层实现文件的读写操作的话,就要使用到Linux的读写函数了. 2.打开文件 int open( const char *pathname,int flags, int mode); 返回值:为一个文件句柄(fd),供read.write等操作. 参数: pathname: 打开的文件所在路径字符串…
前段时间看android版的opencv的配置教程时,看到了它的NDK配置方法,感觉简单又不会出错!!! 1.下载NDK,设置NDK路径: 在windows的系统环境变量中添加NDK的路径,环境变量名设为NDKROOT. 2.为你要使用NDK的java项目添加C++项目属性: 如果eclipse没有CDT,先安装CDT插件. 转换工程:点击“文件 -> 新建 -> 其他”(快捷键:Ctrl+N).选择“C/C++”下的“Convert to a C/C++ Project(Adds C/C++…
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2381586.html Application.mk目的是描述在你的应用程序中所需要的模块(即静态库或动态库). Application.mk文件通常被放置在 $PROJECT/jni/Application.mk下,$PROJECT指的是您的项目. 简介: -----------------------------要将C\C++代码编译为SO文件,光有Android.mk文件还不行,…
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2382225.html 1.  概述 Android.mk文件是用来描述build system(编译系统)的,更准确的说:该文件是一个微型的GNU Makefile片段,将由build system解析一次或者多次. 这个文件的目的是用来允许你将源文件组织成模块,这个模块中含有:一个静态库(.a文件)  或 一个动态库(.so文件) 只有动态库才会被安装/复制到你的应用程序包,尽管静…
一.JNI引用类型 JNI支持三种类型的 opaque reference:local references, global references,和weak global references,下面我们将逐一探讨. local references 大部分JNI 函数都会创建LocalRef,如NewObject创建一个实例,并返回一个指向该实例的LocalRef.LocalRef只在本线程的 native method中有效. 一但native method返回,LocalRef 将被释放.…