Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程

来源:互联网 发布:如何申请软件著作权 编辑:程序博客网 时间:2024/05/18 09:32

通过上一篇相信大家已经对Java和c/c++之间的桥梁JNI有了初步认识,那么接下来就让我们写个小demo来实现。
http://blog.csdn.net/github_33304260/article/details/62891137
let’s show time!

配置:

首先需要把我们本地的NDK环境搭起来:
1. 下载NDK:
AS里面配置NDK超级EASY,点击file–ProjectStructure
这里写图片描述

我这里在NDK Location处已经有了NDK,没有的回提示下载,直接点击下载就好了。
这里写图片描述
2. 配置环境变量
和配置SDK方法一下 在配置文件中添加如下代码(MAC)
这里写图片描述

然后

source .zshrc
  • 1
  • 1

更新一下全局配置(本人用的o-m-zsh)
命令行输入:

ndk-build
  • 1
  • 1

有下面提示说明配置正确,否则会提示command not found

Android NDK: Could not find application project directory !Android NDK: Please define the NDK_PROJECT_PATH variable to point to it./Applications/sdk/ndk-bundle/build/core/build-local.mk:151: *** Android NDK: Aborting    .  Stop.
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

生成.h文件:

一、新建一个类

这里写图片描述

public class NDK  {    // 1.加载实现了native函数的动态库,只需要写动态库的名字    static {        System.loadLibrary("MyJni");    }    // 2.声明这是一个native函数,由本地代码实现    public static native String getStringFromNative();//本地方法    public static native String getString_From_c();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

System.loadLibrary(“MyJni”);加载库,需要注意的是加载的库名即编译生成的库名,去掉前缀lib和后缀so。

二、现在我们make project一下

这里写图片描述

会看到在我们的../app/build/intermediates/classes/debug 目录下生成了一个对应的.class文件
这里写图片描述

三、在app/build/intermediates/classes/debug 目录下执行如下代码javah -jni com.libin.factory.ndk.NDK
!!!这里说明一下:javah是生成头文件需要的工具,-d jni 在工程下生成jni目录,com.libin.factory.ndk.NDK刚才创建的类的全类名。

四、我们现在在 app/build/intermediates/classes/debug 目录下可以看到刚才生产的.h文件:
这里写图片描述

五、我们可以看一下我们的.h文件
这里写图片描述

关联.h和.java文件

当我们完成上面的步骤发现.java里面的方法是红色的没法点击,
如下图:
这里写图片描述

第一步:在main目录下创建jni文件夹将之前生成的.h文件拷贝进来。
这里写图片描述

这里写图片描述

第二步:在gradle里面配置

     ndk {            moduleName "MyJni"          //生成的so名字        }
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这里写图片描述

第三步:在gradle.properties中添加配置Android.useDeprecatedNdk=true

这里写图片描述

第四步:此时我们已经可以点击NDK里面的方法,已经可以和.h之间的方法互相跳转,实现了关联。
这里写图片描述

开始写我们的c++代码了

此时在刚才创建的jni目录下创建cpp文件,名字可以随意啦,我起的jnitest.c
这里写图片描述

我的cpp代码如下:

//// Created by libin on 2017/3/17.//#include "com_libin_factory_ndk_NDK.h"#include "jni.h"/* * Class:     com_libin_factory_ndk_NDK * Method:    getStringFromNative * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_libin_factory_ndk_NDK_getStringFromNative        (JNIEnv * env, jclass){    return (*env).NewStringUTF("ndk");}/* * Class:     com_libin_factory_ndk_NDK * Method:    getString_From_c * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_libin_factory_ndk_NDK_getString_1From_1c        (JNIEnv * env, jclass){    return  env->NewStringUTF("NDK 来自于C文件");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行apk

这里写图片描述

成功啦 ! 我们已经完成了第一个NDK工程啦。

下面我们也可以看到生成的.so文件

这里写图片描述

这里写图片描述

文章转自:http://blog.csdn.net/github_33304260

0 0
原创粉丝点击