Android驱动笔记(2)——jni
一、java和c++的转化
java和C库中间存在数据类型和函数的类型转换的问题。比如:java中char类型是两个字节而在C中只有1个字节;java中字符串用String定义,C中使用的是字符数组char string[]。
因此存在一个转换问题,jni就是这么来的。
jni(java native interface)有两个目的:
- 统一两者的数据类型
- 将java中的方法转换成C语言的函数
java访问c库有两种方法,静态方法和动态方法。java访问动态库就是调用动态库中的函数,指定程序的入口,效率高;而静态方法是全局搜索动态库函数,效率慢,适合库函数少的情况。
二、JNI开发流程
2.1、编写JAVA程序
/*Function:HelloJNI.java*/
class HelloJNI
{
//使用“native”关键字,声明本地方法
native void printHello();
native void printString(String str);
//加载库
static{ System.loadLibrary("hello"); }
public static void main(String args[])
{
HelloJNI myJNI = new HelloJNI();
myJNI.printHello(); //调用本地方法(实际是使用C语言编写的JNI本地函数)
myJNI.printString("Hello World from printString fun");
}
}
之后通过下面命令:
javac HelloJNI.java
javah -jni HelloJNI
生成c语言的头文件HelloJNI.h。
2.2、编写c程序
#include "HelloJNI.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject object)
{
printf("Hello World!\n");
return;
}
JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject object, jstring string)
{
const char *str = (*env)->GetStringUTFChars(env,string,0); //将Java String转换为C字符串
printf("%s!\n", str);
return;
}
再将hello.c编译生成动态库并指定动态库所在的目录:
gcc -shared -fPIC hello.c -o libhello.so -I /usr/lib/jvm/java-7-openjdk-amd64/include
运行java HelloJNI即可得到:
Hello World!
Hello World from printString fun!