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!
    
  • 相关阅读:
    [MetaHook] Find a function signature
    [MetaHook] GameUI hook
    [MetaHook] BaseUI hook
    一些常用软件的网络端口协议分类介绍
    Visual C++中最常用的类与API函数
    Ubuntu常用软件安装
    C++字符串完全指引
    C++资源之不完全导引
    超过 130 个你需要了解的 vim 命令
    Little-endian和Big-endian
  • 原文地址:https://www.cnblogs.com/hansenn/p/12714641.html
Copyright © 2011-2022 走看看