Android驱动笔记(2)——jni

一、java和c++的转化

 java和C库中间存在数据类型和函数的类型转换的问题。比如:java中char类型是两个字节而在C中只有1个字节;java中字符串用String定义,C中使用的是字符数组char string[]。
因此存在一个转换问题,jni就是这么来的。
 jni(java native interface)有两个目的:

  1. 统一两者的数据类型
  2. 将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!
posted @ 2020-04-16 20:38  hansenn  阅读(258)  评论(0编辑  收藏  举报