JNI

来源:互联网 发布:java与模式 pdf 编辑:程序博客网 时间:2024/05/19 16:29
  1. NDK简介
    ndk(Native develop kits 本地开发包),可以让你开发JNI程序(本地方法,对应了C或C++中的方法)。
    配置NDK-build的环境变量:计算机->右键 属性-高级系统设置->环境变量->path->粘贴D:\develops\android-ndk-r9d;

  2. 步骤
    I. 在java中写了一个本地方法:
    // 定义一个本地的方法,这个方法,就相当于C程序中的方法
    public native int hello();
    II. 在工程的根目录下中创建了jni目录;
    III. 在jni目录下写一个c文件,在c文件中实现本地方法:

      #include <stdio.h>      #include <stdlib.h>      //Java_java代码中本地方法的全路径,然后把其中的.替换成_,然后在写方法体      // 注意方法的格式      int Java_cn_itcast_jnihelloworld_MainActivity_hello(){            return 5;        }
     IV. 打包c程序,生成动态库:```        在jni目录下创建Android.mk,添加脚本:        LOCAL_PATH := $(call my-dir)        include $(CLEAR_VARS)        LOCAL_MODULE    := hello        LOCAL_SRC_FILES := helloworld.c        include $(BUILD_SHARED_LIBRARY)        在dos窗口中切换到工程的目录下,执行ndk-build,生成动态库;```     V. 在java代码中调用本地方法:
    // 1.加载动态库(里面是c代码)    // 动态库的 名称:libhello.so ,把前面的lib和后面的.so去掉     System.loadLibrary("hello");    // 2.调用本地方法(相当于调用c程序的方法)     int result = hello();

  1. 使用javah生成头文件
    I.如果jdk的版本是1.7,在dos窗口中切换到工程的src目录下:E:\projects\preLesson\xian03\12\userjavah\src;如果是1.6,应该切换到E:\projects\preLesson\xian03\12\userjavah\bin\classes下,使用javah命令生成头文件:E:\projects\preLesson\xian03\12\userjavah\src>javah cn.itcast.jnihelloworld.MainActivity,刷新工程;    II.把头文件拖到jni目录下;    III.把头文件中的方法拷贝到c文件中,写方法体,把jni导入到c文件中;    VI.使用ndk-build命令重新生成动态库;    V.在java代码中调用本地方法:    // 1.加载动态库(里面是c代码)    // 动态库的 名称:libhello.so ,把前面的lib和后面的.so去掉    System.loadLibrary("hello");    // 2.调用本地方法(相当于调用c程序的方法)    int result = hello();

-
2. Android.mk文件说明

// $表示调用ndk中定义好的方法或者变量    // 加载本地的jni目录,当在dos窗口中执行ndk-build命令时,会找工程目录下中的jni目录;    LOCAL_PATH := $(call my-dir)    // 下次重新生成动态库时,清理掉上次生成的变量    include $(CLEAR_VARS)    // 指定生成的动态库的名称,生成动态库文件后,文件名为libhello.so    LOCAL_MODULE    := hello    // 指定了本地的c文件    LOCAL_SRC_FILES := helloworld.c    // 指定了生成库的类型:BUILD_SHARED_LIBRARY表示动态库.so,BUILD_STATIC_LIBRARY表示静态库.a    // 动态库.so文件小,静态库.a文件大。    include $(BUILD_SHARED_LIBRARY)

3.简便的开发流程

  1.在Java代码中写一个本地方法;  2.使用javah命令生成头文件;  3.在eclipse中指定ndk的路径:window->preference->Android->NDK->NDK Locations:D:\develops\android-ndk-r9d  4.给工程添加jni的本地支持:右键工程->android tools->add native support...;设置库的名称。这一步可以在工程目录下生成jni目录及其目录下的mk、c文件。  5.把jni下的cpp文件改成c文件,并且把mk文件中的.cpp改成.c;  6.把头文件拖到jni目录下;  7.设置JNI头文件的路径:右键工程->properties->C/C++ General->includes->add-File System->D:\develops\android-ndk-r9d\platforms\android-8\arch-arm\usr\include;  8.把头文件引入到c文件中,把头文件中的方法拷贝到c文件中,实现这个方法;  9.选中工程,点击eclipse上面的小锤子,生成动态库;  10.在java代码中调用本地方法:      // 1.加载动态库(里面是c代码)      // 动态库的 名称:libhello.so ,把前面的lib和后面的.so去掉       System.loadLibrary("hello");      // 2.调用本地方法(相当于调用c程序的方法)       int result = hello();
0 0
原创粉丝点击