JNI

  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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值