• Android Studio 之 NDK篇


      由于工作内容的关系,对于NDK的工作涉及比较广(保密性,安全性),所以本章内容讲述一下NDK的基本使用过程。

      网上也有很多这样的教程或者描述,但描述的并不完全

      开发工具:Android Studio 2.1.2 

      NDK版本:android-ndk-r10e,支持64位so库的编译

      JDK版本:1.8 64位

      使用步骤如下:

      第一步:NDK环境的搭建

      ①jdk,Android SDK这些准备充分(只要能正常使用Android Studio的,这一条基本不用考虑)

      ②下载NDK,可以通过Android Studio的SDK Manager下载,也可以通过这个链接下载:下载地址,至于版本的话,根据自己电脑系统自行选择最新版本,

       如果访问不了,需要使用翻墙的话,可以下载天行VPN(有试用版,一天一个小时,关键是不要钱还能翻墙),翻墙工具下载链接:VPN工具下载

      第二步:新建一个Project,完成NDK的配置

      ①在工程的local.properties里面添加NDK的路径代码:

    ndk.dir=C:\android-ndk-r10e

      

      ②在gradle.properties里面声明使用NDK的代码

    android.useDeprecatedNdk=true

      

      ③在app的build.gradle里面,添加NDK的编译信息(包括生成的so库名字,以及编译出来的各种平台版本)

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "24.0.0"
    
        defaultConfig {
            applicationId "edan.com.as_ndk_demo"
            minSdkVersion 11
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
            ndk{
                moduleName "MyTestJniLib" //生成的.so的名字
                abiFilters "armeabi","armeabi-v7a","x86"
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.4.0'
    }

      第三步:编辑native方法,生成.h头文件

      ①编辑native方法

    package edan.com.as_ndk_demo.ndktest;
    
    /**
     * Created by ouyangshengduo on 2016/9/23.
     */
    public class NdkJniUtils {
    
        static {
            System.loadLibrary("MyTestJniLib");   //defaultConfig.ndk.moduleName
        }
        public native String getCLanguageString();
    
    }
    View Code

      ②点击Build-->Make Project,生成class文件

      ③找到class文件,在app->build->intermediates->classes->debug目录下:

      ④通过javah命令生成.h头文件,点击Android Studio底下菜单中的Terminal

      依次敲入:

    cd appuildintermediatesclassesdebug
    javah -jni edan.com.as_ndk_demo.ndktest.NdkJniUtils

    使用javah的时候,具体的包名按照实际情况来书写

      没有什么错误的话,可以在debug目录下看到.h的头文件

      

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class edan_com_as_ndk_demo_ndktest_NdkJniUtils */
    
    #ifndef _Included_edan_com_as_ndk_demo_ndktest_NdkJniUtils
    #define _Included_edan_com_as_ndk_demo_ndktest_NdkJniUtils
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     edan_com_as_ndk_demo_ndktest_NdkJniUtils
     * Method:    getCLanguageString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_edan_com_as_1ndk_1demo_ndktest_NdkJniUtils_getCLanguageString
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

      第四步:根据生成.h头文件,以及新建的.c或者.cpp文件,生成.so库文件

      ①在app->src->main目录下新建一个jni文件夹,用来存c/c++的头文件以及源文件,将刚刚生成.h头文件剪切到这里来,然后新建一个.c或者.cpp文件

      

    #include "edan_com_as_ndk_demo_ndktest_NdkJniUtils.h"
    /*
     * Class:     com_example_edu_ndktest_NdkJniUtils
     * Method:    getCLanguageString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_edan_com_as_1ndk_1demo_ndktest_NdkJniUtils_getCLanguageString
      (JNIEnv *env, jobject obj){
         return (*env)->NewStringUTF(env,"My name is Ouyangshengduo,Hi!");
      }

      ②点击Build->Make Project进行编译,生成.so库文件,路径:app->build->intermediates->ndk->debug->lib下:

      

      ③拷贝lib下的这些文件夹,到app->libs下:

      第五步:通过MainActivity的TextView显示C里面的内容:

      

    package edan.com.as_ndk_demo;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.TextView;
    
    import edan.com.as_ndk_demo.ndktest.NdkJniUtils;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTextView = (TextView) findViewById(R.id.text);
            NdkJniUtils ndk_util = new NdkJniUtils();
            mTextView.setText(ndk_util.getCLanguageString());
    
        }
    }

      至此,Android Studio 的NDK的基础篇讲述完了,期间遇到任何问题或者错误,将错误信息copy去google,基本都能解决,当然,也可以留言,知道的必将言无不尽。

      项目源码下载地址:源码下载

      

  • 相关阅读:
    在Raspberry pi4上架设Minecraft1.17
    解决Android-x86在VMware中不能启动GUI的问题
    WMware player 16在超过两台显示器时的多显示器问题
    制动电阻的阻值和功率计算
    拉卡尼休在石块旷野
    在VirtualBox中调整Raspbian分辨率
    如何在VLC播放器中显示毫秒
    EXCEL高亮选中行/列
    Notepad++加强安全性检查,避免被CIA利用
    AutoCAD AutoLisp 脚本编写
  • 原文地址:https://www.cnblogs.com/ouyangduoduo/p/5900040.html
Copyright © 2020-2023  润新知