zoukankan      html  css  js  c++  java
  • 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!
    ");
        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!
    ", 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!
    
  • 相关阅读:
    php 字符串查找
    php缓存与加速分析与汇总
    oracle 时间问题
    mysql数据迁移
    浅谈千万级PV/IP规模高性能高并发网站架构
    对memcache分布式的一点理解
    美国程序员将工作廉价外包给中国公司遭解雇
    16个Linux服务器监控命令
    在yii中使用memcache
    Windows电脑快捷健大全
  • 原文地址:https://www.cnblogs.com/hansenn/p/12714641.html
Copyright © 2011-2022 走看看