AS的JNI和NDK开发---入门篇

栏目: C++ · 发布时间: 6年前

1. jni----Java Native Interface的缩写,中文即是 java 本地接口。
复制代码

JNI作用是什么

1.使得Java 与 本地其他类型语言(如C、C++)交互
2.在 Java代码 里调用 C、C++等语言的代码 或 C、C++代码调用 Java 代码
复制代码

为什么要有JNI

背景:实际使用中,Java 需要与 本地代码 进行交互
问题:因为 Java 具备跨平台的特点,所以Java 与 本地代码交互的能力非常弱
解决方案: 采用 JNI特性 增强 Java 与 本地代码交互的能力
复制代码

实现步骤

1.在Java中声明Native方法(即需要调用的本地方法)
2.编译上述 Java源文件javac(得到 .class文件)
3.通过 javah 命令导出JNI的头文件(.h文件)
4.使用 Java需要交互的本地代码 实现在 Java中声明的Native方法
4.1.如 Java 需要与 C++ 交互,那么就用C++实现 Java的Native方法
5.编译.so库文件
6. 通过Java命令执行 Java程序,最终实现Java调用本地代码
复制代码

AS实现步骤

第一步 编写代码

在AS的项目中,src/main/java 新建一个类 JniTest(名称按需求填写)
里面内容是(原生C++的方法)比如下:
 public native String java2C();
复制代码

第二步 进行编译

cmd 进入到 src/main/java 目录下  执行以下命令
javah -d  ../jni 包名(如com.jni.test.JniTest) 回车
会生成一个jni文件夹下的.h文件(com_jni_test_JniTest.h)
复制代码

第三步 编写c/c++的源文件(方法名称必须相同)可以直接找写C++的同事开发。

c++文件
 //引入刚才生成的头文件
 #include "com_jni_test_JniTest.h"

 //复制头文件里的要实现的方法名及其参数
 JNIEXPORT jstring JNICALL
 Java_com_jni_test_JniTest_java2C(JNIEnv *env, jobject instance) {
 //    实现这个方法,返回一个字符串
      return env->NewStringUTF("Hello from C++");
 }
复制代码

第四步 重新进行rebuild project

在build/intermediates/ndk/debug/Android.mk 文件 copy出来放在jni目录下
复制代码

第五步 在moudle.gradle文件下配置

defaultConfig{
    ndk {
              moduleName "test"
              //so文件名,如果这里配置了so文件名字,
              //记得更改Android.mk里的LOCAL_MODULE :字段为 LOCAL_MODULE := test 不然默认名字为app 不一样的话不生效
             // abiFilters "armeabi" //指定so文件所支持的CPU类型,如果不写的话,会生成所有的CPU类型的so文件
         }
 }

 android{
  externalNativeBuild {
          ndkBuild {
               path "src/main/jni/Android.mk"//指定Android.mk路径
          }
      }
 }
复制代码

第六步 再次rebuild。

在build/intermediates/ndkBuild/debug/obj/local 生成各个平台的so库。
复制代码

第七步 生成的库文件是以 lib名字.so 命名的。

在最开始的java文件夹下的JavaTest类中 添加如下代码:
 static{
  System.loadLibrary(“名字”);//注意 这里的名字 不需要添加lib 直接写你生成的so库名字,也不需要后缀名。
 }
复制代码

第八步 调用

在Activity中的调用里面的方法  这样就能实现java 与 c++的调用了。
复制代码

配置长久命令到AS的方式

1,打开项目AS 打开设置界面
2.找到Tools/External Tools
3.点击右上角的添加 弹出一个Create Tool的对话框
4.Name javah 
  desc:javah
  Program:$JDKPath$\bin\javah.exe
  Arguments: -d jni -classpath $ModuleFileDir$\src\main\Java $FileClass$
  Working directory: $ModuleFileDir$\src\main
点击ok  点击apply 点击OK
5.在jni代码类点击右键  找到External Tools 里面有一个你配置的javah 点击
直接生成.h文件。
生层.h文件后面操作详见上面生成代码  后面步骤同上。
复制代码

NDK是什么

Native Development Kit,是 Android的一个 工具 开发包
JNI 与 NDK 无直接关系 ---- NDK属于Android,JNI 属于java
复制代码

作用

快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK
通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互
复制代码

使用步骤(必须下载ndk包--可以网上下载也可以在AS下载)

配置 Android NDK环境
创建 Android 项目,并与 NDK进行关联
在 Android 项目中声明所需要调用的 Native方法
使用 Android需要交互的本地代码 实现在Android中声明的Native方法
比如 Android 需要与 C++ 交互,那么就用C++ 实现 Java的Native方法
通过 ndk - bulid 命令编译产生.so库文件
编译 Android Studio 工程,从而实现 Android 调用本地代码
本人用的AS下载的版本AS版本3.4
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First JavaScript Programming

Head First JavaScript Programming

Eric T. Freeman、Elisabeth Robson / O'Reilly Media / 2014-4-10 / USD 49.99

This brain-friendly guide teaches you everything from JavaScript language fundamentals to advanced topics, including objects, functions, and the browser’s document object model. You won’t just be read......一起来看看 《Head First JavaScript Programming》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具