Android JNI Demo
一、操作环境
1.1 VMware虚拟机上安装Ubuntu12.04系统、g++、JDK1.6
1.2 安装g++命令:
sudo apt-get install g++
二、什么是JNI
Java Native Interface(Java本地接口)Android源码中大量使用JNI,可以使Java程序调用C/C++语言程序。C/C++语言相比JAVA而言,运行的效率提高了很多,特别是在做一些图像算法,使用JNI将大大的提高效率。而且反编译起来相比Java将困难很多。那为什么一个Android系统不采用纯C/C++来开发呢?因为Android的UI部分以及Framework框架层中大量采用Java,所以,上层还是采用Java来开发。如果说以后会不会使用C/C++代替Java很难说,因为如果替换整个代码架构又要重新设计,工作量肯定非常之大。
三、操作实例
3.1 创建Java程序
3.1.1 JNIDemo/src/com/android/jni/HelloJni.java
package com.android.jni;
public class HelloJni{
// 采用static静态代码块,让程序最早加载
static {
System.loadLibrary("Hello");// 调用的C/C++动态链接库,动态库名为libHello
}
public native void sayHello();// 函数必须使用native申明
public static void main(String[] args) {
new HelloJni().sayHello();
}
}
3.1.2 编译生成HelloJni.class
3.1.3 命令:javac HelloJni.java
附图:
3.2 生成C++头文件,后缀.h
3.2.1 退回到src目录,生成命令:
需要注意-classpath后面有个点,代表当前目录。包名斜杠改成点。类名不要后缀
javah -classpath . -jni com.android.jni.HelloJni
附图:
3.2.3 JNIDemo/src/com_android_jni_HelloJni.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_android_jni_Hello */
#ifndef _Included_com_android_jni_Hello
#define _Included_com_android_jni_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_android_jni_Hello
* Method: sayHello
* Signature: ()V
*/
// 名称以Java开头,下划线分割,包名,类名,函数名
JNIEXPORT void JNICALL Java_com_android_jni_Hello_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3.3 手动创建JNIDemo/src/Hello.cpp
#include <jni.h>
#include "com_android_jni_HelloJni.h"
#include <stdio.h>
// 这段直接复制com_android_jni_HelloJni.h函数,将分号改为双括号
JNIEXPORT void JNICALL Java_com_android_jni_HelloJni_sayHello
(JNIEnv *, jobject)
{
printf("HELLO JNI...\n");// 这段字符串是待会Java程序跑起来返回的值
return;
}
3.4 编译生成动态链接库
3.4.1 编译命令:
g++ -I/usr/lib/jvm/jdk1.6.0_45/include/linux/ -I/usr/lib/jvm/jdk1.6.0_45/include/ -fPIC -shared -o libHello.so Hello.cpp
3.4.1.1 编译成功后会在src目录下生成libHello.so库文件
3.4.1.2 缺少-I/usr/lib/jvm/jdk1.6.0_45/include/编译错误:
fatal error: jni.h: No such file or directory
3.4.1.3 缺少-I/usr/lib/jvm/jdk1.6.0_45/include/linux/编译错误:
fatal error: jni_md.h: No such file or directory
PS: 貌似安装OpenJDK只要包含到include就行了,里面好像这两个文件都在。
附图:
四、运行Java程序
java -Djava.library.path=. com.magc.jni.HelloJni
附图:
收工,做个好梦!