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

通过上一篇相信大家已经对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
    Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第1张图片

我这里在NDK Location处已经有了NDK,没有的回提示下载,直接点击下载就好了。
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第2张图片
2. 配置环境变量
和配置SDK方法一下 在配置文件中添加如下代码(MAC)
这里写图片描述

然后

source .zshrc

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

ndk-build

有下面提示说明配置正确,否则会提示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.

##生成.h文件:
一、新建一个类

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

public class NDK  {
    // 1.加载实现了native函数的动态库,只需要写动态库的名字
    static {
        System.loadLibrary("MyJni");
    }

    // 2.声明这是一个native函数,由本地代码实现
    public static native String getStringFromNative();//本地方法
    public static native String getString_From_c();

}

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

二、现在我们***make project***一下

这里写图片描述

会看到在我们的../app/build/intermediates/classes/debug 目录下生成了一个对应的***.class***文件
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第4张图片

三、在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***文件:
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第5张图片

五、我们可以看一下我们的***.h***文件
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第6张图片

##关联.h和.java文件
当我们完成上面的步骤发现***.java***里面的方法是红色的没法点击,
如下图:
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第7张图片

第一步:在main目录下创建jni文件夹将之前生成的.h文件拷贝进来。
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第8张图片

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

第二步:在gradle里面配置

	 ndk {
            moduleName "MyJni"          //生成的so名字
        }

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

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

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

第四步:此时我们已经可以点击NDK里面的方法,已经可以和.h之间的方法互相跳转,实现了关联。
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第12张图片

##开始写我们的c++代码了
此时在刚才创建的jni目录下创建cpp文件,名字可以随意啦,我起的jnitest.c
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第13张图片

我的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文件");
}

##运行apk
Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程_第14张图片

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

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

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

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

~~号外~~福利~~号外~~
程序员的福音: “老曾筋骨祛痛贴”,百年祖传配方,专治腰间盘肩周颈椎坐骨神经腰腿疼痛等,博主亲测效果非常棒,因长期久坐写代码,坐姿不规范导致脖子疼,腰椎疼,用过之后疼痛逐渐缓解,现在已无任何疼痛,用过后让你写代码一身轻松,so easy,妈妈再也不用担心我们写代码了。
购买链接: https://k.weidian.com/tja7GYzB

扫码下方二维码,关注公众号“伟大程序猿的诞生“,回复“膏药”领取优惠券
扫码关注公众号“伟大程序猿的诞生“,更多干货新鲜文章等着你~

公众号回复“资料获取”,获取更多干货哦~
公众号回复“膏药”,领取优惠券哦~

有问题添加本人微信号“fenghuokeji996” 或扫描博客导航栏本人二维码

你可能感兴趣的:(JNI,JNI)