JNI

Android.mk文档规范

一曲冷凌霜 提交于 2019-12-05 10:03:37
Android.mk文档规范 Android.mk 编译文件是用来向 Android NDK描述你的 C,C++源代码文件的, 这篇文档描 述了它的语法。在阅读下面的内容之前,假定你已经阅读了 docs/OVERVIEW.TXT 文件,了解 了它们的脚色和用途。 一、概述 一个 Android.mk file 用来向编译系统描述你的源代码。具体来说: (1) 该文件是GNU Makefile的一小部分, 会被编译系统解析一次或更多次的build系统。 因此,您应尽量减少您声明的变量,不要认为某些变量在解析过程中不会被定义。 (2)这个文件的语法允许把你的源代码组织成模块,一个模块属下列类型之一: 1)静态库 2)共享库 且只有共享库将被安装/复制到您的应用软件包,虽然静态库能被用于生成共享库。 可以在每一个 Android.mk file 中定义一个或多个模块, 你也可以在几个模块中使用同一个 源代码文件。 编译系统为你处理许多细节问题。例如,你不需要在你的 Android.mk 中列出头文件和依 赖文件。NDK 编译系统将会为你自动处理这些问题。这也意味着,在升级 NDK 后,你应该 得到新的 toolchain/platform支持,而且不需要改变你的 Android.mk 文件。 注意,这个语法同公开发布的 Android平台的开源代码很接近,然而编译系统实现他们的

用 JNI 进行 Java 编程(4)

折月煮酒 提交于 2019-12-05 08:00:46
高级主题 概述 从 Java 程序内调用本机代码破坏了 Java 程序的可移植性和安全性。尽管已编译的 Java 字节码保持了很好的可移植性,但必须为您打算用来运行该应用程序的每个平台重新编译本机代码。另外,由于本机代码在 JVM 之外执行,所以约束它的安全性协议不必和 Java 代码的相同。 从本机程序调用 Java 代码也很复杂。因为 Java 语言是面向对象的,所以从本机应用程序调用 Java 代码通常涉及面向对象技术。有些本机语言不支持面向对象编程或只是有限地支持面向对象编程(譬如 C),使用这些语言调用 Java 方法可能会产生问题。在本节中,我们将讨论使用 JNI 所带来的若干复杂性,并研究解决它们的方法。 Java 字符串 vs. C 字符串 Java 字符串是作为 16 位 Unicode 字符存储的,而 C 字符串是作为一组 8 位且以空字符为结束的字符存储的。JNI 提供了几个有用的函数,它们用于在 Java 字符串和 C 字符串之间进行转换并操作这两种字符串。下面的代码片段演示了如何将 C 字符串转换成 Java 字符串: /* Convert a C string to a Java String. */ char[] str = "To be or not to be.\n"; jstring jstr = (*env)->NewStringUTF(env

安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord

懵懂的女人 提交于 2019-12-05 06:52:50
$\color{#2980C6}{目录}$ 1、基础概念 ├──1.1、JNI ├──1.2、NDK ├──1.3、CMake与ndk-build 2、环境搭建 3、Native C++ 项目(HelloWord案例) ├── 3.1、项目创建(java、kotlin) ├── 3.2、CMake的应用(详细讲解) ├── 3.3、ndk-build的应用(详细讲解) *** 1、基础概念 1.1、JNI JNI(Java Native Interface)Java本地接口,使得Java与C/C++具有交互能力 1.2、NDK NDK(Native Development Kit) 本地开发工具包,允许使用原生语言(C和C++)来实现应用程序的部分功能 Android NDK开发的主要作用: 1、特定场景下,提升应用性能; 2、代码保护,增加反编译难度; 3、生成库文件,库可重复使用,也便于平台、项目间移植; 1.3、CMake与ndk-build 当我们基于NDK开发出native功能后,通常需要编译成库文件,给Android项目使用。 目前,有两种主流的编译方式:__CMake__与 ndk-build __CMake__与__ndk-build__是两种不同的编译工具(与Android代码和C/C++代码无关) CMake CMake是Androidstudio2

Eclipse Ndk开发中的Method 'NewStringUTF' could not ...

雨燕双飞 提交于 2019-12-05 00:16:57
最近需要用到android的ndk,但是在eclipse中,一直提示Method 'NewStringUTF' could not be resolved,诸如此类的错误。 可问题是,jni.h等一系列的依赖库,我都已经导入了,并且也能正常的使用build来编译出动态库文件。但是sb的就是eclipse的cdt,仍旧会不停的提示这类的错误,导致整个项目没办法编译过去。 后来,我先问了baidu,然后又问了google,最终折腾了两天也没办法很好解决这个问题,只好苦逼的使用code::block来写c的jni代码,然后关闭eclipse的code 检查功能,最终才使得项目可以完整编译过去。 后来我思考了一下,并做了一些实验,发现这个估计是adt本身的一个bug,或者说是一个信号??首先,我使用adt的add native support library 来使得jni可以合并到项目中。这时候我发现默认生成的是cpp文件。。c++??这个问题之前我一直忽略了,所以我干脆使用c++来写这个库,结果我发现在cpp文件中,无论你是按照c++语法来写,还是c语法来写,最终结果都是正常的。不会出现这种好似没有导入的错误。 这不得不让我感觉是否google下一步的ndk开发,主要是支持c++了??? 可是更加苦逼的是,我仍旧没有好的解决办法,总不能之前的代码在用c++写一遍吧

Android Studio JNI开发

二次信任 提交于 2019-12-04 23:43:21
Android Studio JNI开发 http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86.zip http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86_64.zip http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86.tar.bz2 http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86_64.tar.bz2 http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2 http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86_64.tar.bz2 http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86.zip http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86_64.zip http://dl.google.com

ubuntu eclipse安装svn插件,unable to load default sv...

大兔子大兔子 提交于 2019-12-04 22:52:58
每回重新安装系统都要找一回,这次己下来.... 方法一: 启动时会提示: Failed to load JavaHL Library. These are the errors that were encountered: no libsvnjavahl-1 in java.library.path no svnjavahl-1 in java.library.path no svnjavahl in java.library.path java.library.path = /usr/lib/jni/ 这个提示已经比较明显了,我们需要安装 root@ubuntu:~# sudo apt-get install libsvn-java 并在安装eclipse目录下,修改eclipse.ini文件,在"-vmargs"之后增加 -Djava.library.path=/usr/share/java/ -Djava.library.path=/usr/lib/jni/ 重启eclipse,就OK了。问题可以解决! 方法二: 下载subclipse插件到Eclipse的 dropins目录 http://subclipse.tigris.org/files/documents/906/48783/site-1.6.17.zip 来源: oschina 链接: https://my

用Android Sutdio调试NDK

ⅰ亾dé卋堺 提交于 2019-12-04 19:30:44
网上用 Android Studio 调试 NDK 的资料不多且分散。我将这几天踩过的坑及经验纪录一下,方便其它朋友。我将从导入一个 NDK Samples 中的项目开始。 演示代码放在 GitHub 上,每个坑为一次Submit。 开发环境 操作系统: Mac OS 10.11.1 IDE: Android Studio 1.5.1 NDK: android-ndk-r10e Native链接其它库 加载 NDK Samples 中的 hello-gl2 项目后,直接运行会出现如下错误: Error:(39) undefined reference to `glGetError' Error:(41) undefined reference to `__android_log_print' ... 在 build.gradle 文件中添加命令来链接相关库,具体可见 Mac下用Android Studio运行NDK samples 。 无法进入Native代码 解决库链接问题后,程序能运行正确运行在设备上,可无法中断在Native代码上的断点处。 看到一些文章,如 《AndroidNDK开发在本地C/C++源代码中设置断点单步调试详细教程》 说的是ADT上的调试; 《Using Eclipse for Android C/C++ Debugging》 (需翻墙

JVM GC相关问题

爷,独闯天下 提交于 2019-12-04 16:45:43
http://blog.csdn.net/u011080472/article/details/51324422 1.0 并发和并行 这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下。 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。 1.1 Minor GC 和 Full GC 新生代GC(Minor GC / Young GC / YGC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。 老年代GC(Major GC / Full GC / FGC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。 2 Java中什么样的对象才能作为gc root,gc roots有哪些呢? http://blog.csdn.net/fenglibing/article/details

JNI的某些数组和字符串类型转换

十年热恋 提交于 2019-12-04 07:51:35
1、jbytearray转c++byte数组 jbyte * arrayBody = env->GetByteArrayElements(data,0); jsize theArrayLengthJ = env->GetArrayLength(data); BYTE * starter = (BYTE *)arrayBody; 2、jbyteArray 转 c++中的BYTE[] //jbytearray strIn jbyte * olddata = (jbyte*)env->GetByteArrayElements(strIn, 0); jsize oldsize = env->GetArrayLength(strIn); BYTE* bytearr = (BYTE*)olddata; int len = (int)oldsize; 3、C++中的BYTE[]转jbyteArray //nOutSize是BYTE数组的长度 BYTE pData[] jbyte *by = (jbyte*)pData; jbyteArray jarray = env->NewByteArray(nOutSize); env->SetByteArrayRegin(jarray, 0, nOutSize, by); 4、jbyteArray 转 char * char* data = (char*

Android之NDK开发

杀马特。学长 韩版系。学妹 提交于 2019-12-04 01:22:30
一、NDK产生的背景   Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于 Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布 时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台 上,“Java+C”的编程方式是一直都可以实现的。   不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,Android SDK文档里,找不到任何JNI方面的帮 助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。比如 程序更加复杂,兼容性难以保障,无法访问Framework API,Debug难度更大等。开发者需要自行斟酌使用。   于是NDK就应运而生了。NDK全称是Native Development Kit。   NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。 二、为什么使用NDK   1.代码的保护。由于apk的java层代码很容易被反编译,而C/C+