Android studio 使用NDK工具实现JNI编程

前言:

Android开发中经常会使用到第三方的.so库,在使用.so库的时候就要用到JNI编程。JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。开发中一般都用第三方的库,很多时候也可能我们自己来编写C或者C++来实现JNI编程,这篇博客主要是介绍Android studio 使用NDK工具来开发JNI编程。

环境配置

JNI编程需要满足如下前提:

  1. 你必须有安装Android studio开发idea编辑器(本人使用的是android studio 1.3版本)。
  2. 下载最新版本的NDK工具,然后解压到一个目录即可(配置NDK环境变量时使用到该路径)。我的ndk版本为 android-ndk-r10e
  3. 配置ndk环境变量,计算机–>属性–>高级系统设置–>环境变量–>系统变量–>新建 变量名:NDK_ROOT;变量值:F:\Android\SDK1\android2\android-ndk-r10e(此处是我的ndk路径,换成你自己的ndk路径即可)。
  4. 当然前提是你要配置了jdk环境变量,配置如同第三点:变量名:JAVA_HOME;变量值:F:\Android\SDK1\android2\Java\jdk1.7.0_67(此处是我的jdk路径,换成你自己的jdk路径即可)。除此之外,你还得新建一个CLASSPATH环境变量,变量名:CLASSPATH;变量值为 .;%HOME_PATH%\lib; 一开始的 . 和;和最后的;都是需要的。
  5. 你还需要在gradle.progerties文件下添加如下代码
android.useDeprecatedNdk=true

如果没有gradle.progerties文件,请直接在当前工程下新建该文件即可。

JNI编程

1.新建JniUtils类,用来调用jni方法。代码如下:

package com.example.xjp.myjnidmoe;

public class JniUtils {
//加载静态库
    static {
        System.loadLibrary("Test");//此处加载的是相应的模块库,名称必须和 ndk的moduleName名一样。
    }
//定义本地方法
    public native String getValue();
}

2.Build 编译当前工程,最后会在build目录下生成如下文件
这里写图片描述
该目录下生成了 JniUtils.class文件。然后打开AS的Terminal终端,跳到debug目录下:这里写图片描述
然后执行 javah -jni *(此处为你的目标文件路径,即JniUtils路径)
这里写图片描述
最后会在debug目录下面生成 com_example_xjp_myjnidmoe_JniUtils.h 头文件。代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_xjp_myjnidmoe_JniUtils */

#ifndef _Included_com_example_xjp_myjnidmoe_JniUtils
#define _Included_com_example_xjp_myjnidmoe_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_xjp_myjnidmoe_JniUtils
 * Method:    getValue
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_xjp_myjnidmoe_JniUtils_getValue
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

以上代码是自动生成的,无需开发者去修改。

3.在你的main目录下新建jni子目录,如下:这里写图片描述
将刚才生成的 .h头文件复制到该jni目录下,然后新建一个 test.c文件,test.c文件代码如下:

//
// Created by 850302 on 2016/4/26.
//

#include "com_example_xjp_myjnidmoe_JniUtils.h"

JNIEXPORT jstring JNICALL Java_com_example_xjp_myjnidmoe_JniUtils_getValue
        (JNIEnv *env, jobject obj) {
    return (*env)->NewStringUTF(env, "This is my first JNI demo!");
}

由于jni编程对方法的名称有一定规则要求,开头需要Java_ 后面依次是jni方法的java类路径,以“_”分割。开发者为了不写错,可以直接将刚才的.h头文件中的方法 copy下来直接实现即可。

4.配置Gradle文件
首先你得配置当前工程的 build.gradle文件,其实配置很简单,直接在原来的build.gradle文件里添加 ndk的配置即可。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.xjp.myjnidmoe"
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        //这里是配置ndk
        ndk{
            //定义库的模块名称。该名称用于System.loadLibrary("Test")
            moduleName "Test" 
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

是不是很简单,仅仅是定义了 ndk 的moduleName的名称而已。

其次是为当前工程配置指定的ndk,配置方法如下:右键当前工程名,选择Open Module Settings,弹出如下窗口。这里写图片描述
如图,1:sdk路径;2:jdk路径;3:ndk路径;点击ok之后。会在local.properties文件下配置指定的sdk和ndk路径:

#Tue Apr 26 18:36:18 CST 2016
ndk.dir=F\:\\Android\\SDK1\\android2\\android-ndk-r10e
sdk.dir=F\:\\Android\\SDK1\\android2\\sdk

如此,所有的准备工作都已经完成。现在可以在你的代码中使用Test库了,调用代码如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView) findViewById(R.id.text);

        //start=====
        JniUtils jniUtils = new JniUtils();
        String content = jniUtils.getValue();
        //end=====
        textView.setText(content);

    }

结果如下:这里写图片描述

可能会有人问,代码生成的libTest.so库在哪里呢?其实生成的libTest.so库已经打包到apk中去了,那么假如我要把这个so库给别人使用怎么办?很简单,在你编译的过程其实已经生成了libTest.so,在哪里呢?目录如下:bulid/intermediates/ndk目录下,该目录是编译成功之后生成的。这里写图片描述
看到没?生成了不同平台下的libTest.so库。

总结

该博客主要是记录Android studio 下使用NDK工具实现JNI编程和生成so库的整个过程,以便开发者了解JNI编程的一个完整的过程。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 1. 下载并安装NDK 首先,你需要从官网下载NDK。下载完成后,解压到你想要的目录下。 2. 配置NDK路径 打开Android Studio,选择File -> Project Structure,在左侧的菜单中选择SDK Location,然后在右侧的NDK location中输入你的NDK路径。 3. 创建jni目录 在你的项目根目录下创建一个名为jni的文件夹。 4. 创建C/C++文件 在jni目录下创建一个名为hello-jni.c的文件,并输入以下代码: #include <jni.h> #include <string.h> jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello from JNI!"); } 5. 创建Android.mk文件 在jni目录下创建一个名为Android.mk的文件,并输入以下代码: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) 6. 创建Application.mk文件 在jni目录下创建一个名为Application.mk的文件,并输入以下代码: APP_ABI := all 7. 构建项目 在Android Studio中选择Build -> Make Project,然后等待构建完成。 8. 运行项目 在Android Studio中选择Run -> Run 'app',然后等待应用程序启动。 以上就是Android Studio配置NDK的步骤,希望对你有所帮助。 ### 回答2: Android Studio是谷歌官方推出的一款Android开发工具使用Android Studio开发Android应用程序可以大大提高开发效率和开发质量。Android Studio支持使用NDK进行开发,NDK全称是Native Development Kit,用于编写或调整已有的C/C++代码库,将这些库集成至Android中,以提高应用程序的性能或实现一些不便于使用Java或Kotlin语言实现的功能。下面是关于Android Studio配置NDK的步骤: 1. 下载和安装Android Studio,打开Android Studio后,在“welcome to Android Studio”窗口中点击“configure”,选择“SDK Manager”。 2. 在SDK Manager窗口中,选择“SDK Tools”标签页,勾选“NDK”选项。在“SDK Platforms”和“SDK Tools”标签页中,选择“Show Package details”选项,选择需要的NDK版本,下载并安装。 3. 创建一个新项目或打开已有的项目。在打开的项目中,打开“File”选项,选择“Project Structure”选项卡,选择“SDK Location”,查看“Android NDK location”选项卡,如果NDK路径没有被设置,则点击“…”按钮选择NDK路径。然后,点击OK保存更改。 4. 结束上一步后,还需要在Gradle文件中设置NDK的路径。找到“build.gradle(Module:app)”文件,然后在其中添加以下代码: ```c++ android { … externalNativeBuild { cmake { // Specifies the directory where the CMakeLists.txt file is located. path "src/main/cpp/CMakeLists.txt" // Specifies the ABI configurations of your native // libraries Gradle should build and package with your APK. abiFilters "armeabi-v7a", "x86" // Passes optional arguments to CMake. arguments "-DANDROID_STL=c++_static" } } … } ``` 以上是Android Studio配置NDK的步骤,如按照上述步骤操作仍然有问题,建议参考官方NDK文档,自行查找解决方法。 ### 回答3: Android Studio是目前最流行的Android开发工具之一,而Android NDK则是一个能够将C、C++代码与Java代码结合使用的开发工具。在某些情况下,为了提高应用程序的性能,我们可能需要使用NDK开发Android应用程序。接下来,我们将详细介绍如何在Android Studio中配置NDK。 1. 首先,您需要先下载并安装NDK。您可以从Google开发者网站下载最新版的NDK。 2. 打开Android Studio,然后单击“File”菜单中的“Project Structure”选项。 3. 在左侧的面板中,单击“SDK Location”选项卡。然后,在“Android NDK location”文本框中输入您的NDK路径,并单击“OK”。 4. 下一步是在您的应用程序中配置NDK。为此,请打开您的项目的“build.gradle”文件,并添加以下代码: ``` android { // ... defaultConfig { // ... ndk { // 设置你的 ndk 的路径 abiFilters 'armeabi-v7a', 'x86' } } } ``` 在“abiFilters”中添加您想要支持的CPU指令集。例如,如果您想要支持armeabi-v7a和x86指令集,您可以像上面的代码一样设置。 5. 最后,在您的项目中添加C或C++代码。如果您还没有C或C++代码,可以通过创建一个具有指定名称和位置的文件夹来添加代码。例如,在您的 Android 项目根目录下创建名为“jni”的文件夹: ``` $ cd /path/to/your-project $ mkdir jni ``` 在这个文件夹中,您可以添加您的C或C++代码。 6. 在Android Studio中构建您的项目并运行它,以确认您已成功配置NDK。 现在,您已经学会了在Android Studio中配置NDK。这将使您能够使用C或C++代码来实现更高的应用性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值