Android小白成长之初级篇:NDK配置
AndroidNDK(Native Development Kit)实际上属于JNI(Java Native Interface)的一部分,JNI就是允许Java代码和其他语言写的代码进行交互。Android基于Java平台,自然也是支持这个特征了,因此Android NDK就是支持在Android平台上使用Java语言调用采用C/C++编译的库文件的一系列工具。
<IGNORE_JS_OP>
|
2.NDK的目录结构说明:
下载Linux平台的NDK文件解压缩后看到的目录结构如下所示:
<IGNORE_JS_OP>
build:进行编译时用到的脚本和一些补丁
docs:有关NDK的相关文档
platforms:针对不同Android发行版本进行编译用到的头文件和库文件
prebuilt:一些小工具,用于真正编译前的预处理阶段
samples:给出了一些NDK的例子
sources:一些在编译过程中被脚本或其它工具用到的头文件和库文件
tests:执行NDK的自动化测试,确保NDK正式发布后能够正常运行
toolchains:具体进行编译时的工具,包括对三种架构arm、mips和x86的支持 |
|
2.NDK的目录结构说明:
下载Linux平台的NDK文件解压缩后看到的目录结构如下所示:
<IGNORE_JS_OP>
build:进行编译时用到的脚本和一些补丁
docs:有关NDK的相关文档
platforms:针对不同Android发行版本进行编译用到的头文件和库文件
prebuilt:一些小工具,用于真正编译前的预处理阶段
samples:给出了一些NDK的例子
sources:一些在编译过程中被脚本或其它工具用到的头文件和库文件
tests:执行NDK的自动化测试,确保NDK正式发布后能够正常运行
toolchains:具体进行编译时的工具,包括对三种架构arm、mips和x86的支持 |
two-libs:两个库的使用,first为静态库,second为动态库,并且second库调用first库
我们以NDK开发包中自带的例子hello-jni来进行演示和说明。进入jni目录下,运行ndk-build就可以进行编译了,如下图所示:
<IGNORE_JS_OP>
在Eclipse中加载该例子,由于该例子最开始不是Eclipse项目,需要创建新项目,选择从源代码方式创建,如下图所示:
<IGNORE_JS_OP>
<IGNORE_JS_OP>
<IGNORE_JS_OP>
从上面两幅图可以看到,hello-jni在Java环境中的类HelloJni中声明的函数名为stringFromJNI,前面要用到修饰符native,类HelloJni所在的包名为com.example.hellojni,需要用函数System.loadLibrary加载lib库libhello-jni.so,采用static修饰符确保只加载一次。然后按正常函数使用就行了。而在NDK这边,即C语言这层,函数命名要遵循Java_包_类_函数的命名方式,中间用下划线_进行连接,如上面所示,在包com.example.hellojni中的类HelloJni声明为stringFromJNI,则在C/C++文件中定义的函数名为Java_com_example_hellojni_HelloJni_stringFromJNI,注意区分大小写。函数可以传参数,本例子中没有传入参数,只是有返回参数,返回参数的数据类型为jstring,即Java中的String类型。对于C/C++中与上面的Java环境打交道的数据类型可以参照JNI,具体可访问官方网站http:// java.sun.com/docs/books/jni/。对于函数Java_com_example_hellojni_HelloJni_stringFromJNI中的两个参数env和thiz是系统必须的,如果需要输入参数,必须再增加参数。这个例子运行的结果就是在文本控件(TextView)上面显示Hello from JNI by C !,如下图所示:
<IGNORE_JS_OP>
我们对上面的例子hello-jni稍微改动,改名为hello-jni-ex,为了以示区别把类名和包名也稍微修改了一下。 C++语言这种方法灵活性更好,当然,具体采用哪一种根据自己的喜好选择。Hello-jni-ex如下图所示:
<IGNORE_JS_OP>
<IGNORE_JS_OP>
<IGNORE_JS_OP>
V void void
Z jboolean boolean
I jint int
J jlong long
D jdouble double
F jfloat float
B jbyte byte
C jchar char
S jshort short
数组则以"["开始,用两个字符表示
[I jintArray int[]
[F jfloatArray float[]
[B jbyteArray byte[]
[C jcharArray char[]
[S jshortArray short[]
[D jdoubleArray double[]
[J jlongArray long[]
[Z jbooleanArray boolean[]
Ljava/net/Socket; Socket jobject
浙公网安备 33010602011771号