Android NDK 开发(五)AndroidStudio 2.2 更友好的支持NDK

前言之前一直在用Eclipse 做开发,直到今年年初才将项目迁移到Google 推荐的AndroidStudio上面,毕竟这是一个趋势,可谁知道事情根本没有我想的那么简单,这期间遇到了N多坑,我想这些坑可能大家也有可能遇到,不在这里详细叙述。最终一个个问题的去解决,走完了这些坑,觉得还挺好用的,Eclipse 是一个吃内存的IDE,反正我每次打开,编写代码的时候就会卡,有时候还是死掉,已无力吐糟~~,AndroidStudio的界面更人性化,除此之外,还有更多的功能。所以决定把之前在正在eclipse上开发的一个使用NDK开发的android项目转移到AndroidStudio上,在2.2之前对C/C++ 支持不是很友好,没有语法提示,编译也不方便等问题,所以期待了的Android Studio 2.2 版本稳定版终于在前段发布,一直未来得及尝试,今天把整个过程记下来,希望能给你有所帮助。 参考文献:https://developer.android.com/studio/projects/add-native-code.html#create-sources     Continue Reading
Xiho's avatar
Xiho Oct 19, 2016
 | 

Android NDK 开发(四)JNI 中局部引用、全局引用和弱全局引用

前言做过Java的朋友都知道,内存管理这一块是完全透明的,new一个类的实例时,只知道创建完这个类的实例后,会返回这个实例的一个引用,然后拿着这个引用去访问它的成员了(属性、方法),完全不用管JVM内部怎么实现的,如何为新建的对象申请内存,使用完之后如何释放内存,只需要知道有个垃圾回收器在处理这些事情就行了,然而,从Java虚拟机创建的对象传到C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不回触发该引用所指向Java对象的垃圾回收;这些引用在JNI 中分为3种:全局引用(Global Reference)、局部引用 (Local Reference)、弱全局引用 (Week Global Reference) since JDK1.2。 正文三种引用的区别1、全局引用全局引用可以跨方法、跨线程使用,直到被开发者显式释放。类似局部引用,一个全局引用在被释放前保证引用对象不被GC回收。和局部引用不同的是,没有那么多函数能够创建全局引用。能创建全局引用的函数只有 NewGlobalRef。以下例子说明了如何使用一个全局引用。 java native方法: public native void createGlobalRef(); public native String getGlobalRef(); public native void deleteGlobalRef();     Continue Reading
Xiho's avatar
Xiho Oct 18, 2016
 | 

Android NDK开发(三)C访问Java属性和方法

前言native方法虽然是native的,但毕竟是方法,那么就应该同其他方法一样,能够访问类的属性和方法。实际上,JNI的确可以做到这一点,我们通过几个例子来说明~ 正文继 Android NDK 开发(二)JNI 传递参数和返回值之后。 1.访问类方法初始化了Java虚拟机后,就可以开始调用Java的方法。要调用一个Java对象的方法必须经过几个步骤: 1.1获取指定对象的类定义(jclass)有两种方式来获取对象的类定义:第一种是在已知类名的情况下使用FindClass来查找对应的类。但是要注意类名并不同于平时写的Java代码,例如要得到类jni.test.Demo的定义必须调用如下代码: jclass cls = (*env)->FindClass(env, "jni/test/Demo"); //把点号换成斜杠 第二种是通过对象直接得到其所对应的类定义: jclass cls = (*env)-> GetObjectClass(env, obj); //其中obj是要引用的对象,类型是jobject     Continue Reading
Xiho's avatar
Xiho Oct 06, 2016
 | 

Android NDK开发(二)JNI传递参数和返回值

前言我们在使用 JNI 时最常问到的是 JAVA 和 C/C++之间如何传递数据,以及数据类型之间如何 互相映射。我们从整数等基本类型和数组、字符串等普通的对象类型开始讲述。至于如何传递任意对象,将在后面会更新。 正文继JNI简介及调用流程这篇文章,我们再来实现一个非静态的native方法。 Java端: public class JniTest { //静态的 public native static String getStringFromC(); //非静态的 public native String getString2FromC(int i); public static void main(String[] args) { String text = getStringFromC(); System.out.println(text); JniTest t = new JniTest(); text = t.getString2FromC(6); System.out.println(text); } //加载动态库 static{ System.loadLibrary("jni_study"); } }     Continue Reading
Xiho's avatar
Xiho Oct 06, 2016
 | 

Android NDK开发(一)JNI简介及调用流程

前言前段时间学习了C、C++的一些基础知识后,了解了它们的编码风格,要想掌握NDK开发,前提是会使用JNI,下面我们开始简单的介绍吧! JNI简介  JNI全称是Java Native Interface(Java本地接口),本地接口就是指用C和C++开发的接口。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。   开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。而且编译后生成的二进制代码只能在本地操作系统环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。这就造成使用了JNI接口的JAVA程序,不再像以前那样自由的跨平台。如果要实现跨平台,就必须将本地代码在不同的操作系统平台下编译出相应的动态库。     Continue Reading
Xiho's avatar
Xiho Sep 23, 2016
 |