Java JNI Demo

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程序

4.1 运行命令
java -Djava.library.path=. com.magc.jni.HelloJni
附图:

收工,做个好梦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值