android jni ndk 开发实践和理论基础

android jni ndk 开发实践和理论基础

  • 工匠若水的系列文章

NDK-JNI实战教程(一) 在Android Studio运行第一个NDK程序

NDK-JNI实战教程(二) JNI官方中文资料

NDK-JNI实战教程(三) 从一个比Hello World稍微复杂一丁点儿的例子说说模板

ps:运行上面例子的时候,可能提示ndk插件太老,可在 gradle.properties 中添加 android.useDeprecatedNdk=true

  • 《JNI完全手册》作者的博客系列

Android JNI和NDK学习(01)–搭建NDK开发环境

Android JNI和NDK学习(02)–静态方式实现JNI

Android JNI和NDK学习(03)–动态方式实现JNI

Android JNI和NDK学习(04)–NDK调试方法

Android JNI和NDK学习(05)–JNI真机调试

Android JNI和NDK学习(06)–JNI的数据类型

Android JNI和NDK学习(07)–JNI的常用API

Android JNI和NDK学习(08)–JNI实例一 传递基本类型数据

Android JNI和NDK学习(09)–JNI实例二 传递类对象

《JNI完全手册》

  • 我的总结

JNI 和 NDK 开发不是一回事, JNI 是 java 虚拟机实现的加载本地方法的机制。

执行环境

java JVM

android 5.0- DVM

android 5.0+ ART

NDK 其实就是提供了一些 头文件和c、cpp文件

最终编译成的是 .so 文件

android 加载执行 .so 文件

.so 文件会放在 /data/data/<youappPackage>/lib/ 下面,系统会从该目录下查找 .so 文件 [这个还需要验证5.0-、5.0+]

.so 文件的定义?
android 如何加载 .so 文件?
android 执行的是字节码,应该也是遵循了 jni 规范,否则也不可能会执行 .so 文件?
android 上的字节码最终也是转换成了二进制 所以就是 [‘字节码 -> 二进制’ ‘.so二进制”] 同级的?

加载so文件:
程序员可用单个库来存放任意数量的类所需的所有本地方法,只要这些类将被相同的类加载器所加载。虚拟机在其内部为每个类加载器保护其所加载的本地库清 单。提供者应该尽量选择能够避免名称冲突的本地库名。

————————-

参考资料:
1、关于Android的.so文件你所需要知道的 http://www.jianshu.com/p/cb05698a1968
1:7种cpu架构:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。
2:Native Libs Monitor这个应用可以帮助我们理解手机上安装的APK用到了哪些.so文件,以及.so文件来源于哪些函数库或者框架。
3:推荐使用app的minSdkVersion对应的编译平台。
4:通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app的nativeLibraryPath目录中;在大于等于Android 5.0的系统中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目录中。

2、linux下动态库so文件的一些认识 http://mypyg.iteye.com/blog/845915
1:so文件是什么? 是ELF格式文件,共享库(动态库),类似于DLL。节约资源,加快速度,代码升级简化。 知道这么多就够了,实用主义。等有了印象再研究原理。

3、so文件解析,与dll文件的区别 http://wenku.baidu.com/view/09ba974033687e21af45a9f8.html?re=view
———————————————————————————————————————————–
javah 生成头文件注意事项:
1、注意目录 eclipse 在 /bin ; android studio 在 /app/build/intermediates/classes/debug

2、java -jni

3、文件名是包名 + 文件名字(不带扩展)

最后生成的文件会放在/bin下或者/app/build/intermediates/classes/debug 下
———————————————————————————————————————————–
如果底层操作系统不支持动态链接,则必须事先将所有的本地方法链接到虚拟机 上。这种情况下,虚拟机实际上不需要加载库即可完成 System.loadLibrary 调 用。???
native 中如何访问 java 自定义对象 ?

发表评论

电子邮件地址不会被公开。