Android NDK开发,使用ndk-build编译

一,开发环境

      win10   AndroidStudio 3.1.2  NDK版本:R16

二,配置NDK环境变量: 

    和配置Java JDK环境变量相同,不会的可以自行百度配置NDK环境变量,很多种;

三,在自己项目创建本地方法:

四,手动创建本地方法fromJNIString()对应的.h头文件

1,在电脑的cmd 或者AndroidStudio的Terminal中输入javah -d D:\Demo\NDKDemo\app\src\main\jni -classpath D:\Demo\NDKDemo\app\src\main\java com.ang.ndkdemo.MainActivity

      1)D:\Demo\NDKDemo是我的项目路径       \app\src\main\jni 要创建的.h头文件的输出路径  

      2)-d D:\Demo\NDKDemo\app\src\main\jni      创建jni文件夹并指定.h输出目录

     3)D:\Demo\NDKDemo\app\src\main\java com.ang.ndkdemo.MainActivity    包含本地方法(fromJNIString())的类的绝对路    径,com.ang.ndkdemo.MainActivity  注意是包名+类名,不要写成了D:\Demo\NDKDemo\app\src\main\java\com\ang\ndkdemo\MainActivity; 

2,执行以上命令之后:就在项目的main文件夹下创建了jni文件夹,并且在jni文件夹下自动创建了.h头文件;

3,生成.h头文件时候,如果出现“找不到类文件”的错误请参考  https://blog.csdn.net/ezconn/article/details/82352531这篇文章

五,在jni目录下创建c或者c++文件,名字随意

C++代码(注意C和C++代码是由区别的这个):

1)Hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)->调用方法且方法中要传入env.

#include <jni.h>
#include "com_ang_ndkdemo_MainActivity.h"
 JNIEXPORT jstring JNICALL
 Java_com_ang_ndkdemo_MainActivity_fromJNIString(JNIEnv* env, jobject obj) {
     return (*env)->NewStringUTF(env,"I am From Native C");
 }


2) Hello.cpp文件。C++中env为一级指针,用env->调用方法,无需传入env;C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern "C"进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名;exter "C"{jni代码}。
 

#include <com_ang_ndkdemo_MainActivity.h>
#include <stdio.h>

JNIEXPORT jstring JNICALL
Java_com_ang_ndkdemo_MainActivity_fromJNIString(JNIEnv *env, jobject obj)
{
    return env->NewStringUTF("I am From Native C");
}

六,配置build.gradle(Model:App)

    defaultConfig {
        applicationId "com.ang.demo"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        //ndk编译生成.so文件
        ndk{
            moduleName "Java2c"         //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。
        }
    }

七,编写Android.mk文件(自行百度吧,我也不太会) 如下是我的自动生成方式:

1)紧接着步骤六之后,点击Androidstudio 菜单栏 Build ->ReBuildProject

     报错:

2)在app ——> build ——>intermediater——>ndk(自动创建)目录下自动创建了一个Android.mk文件

八,Android.mk文件复制到jni目录下; 鼠标右键,点击Link C++ .....修改Androidstudio默认编译工具,在BuildSystem栏选择ndk-build,在ProjectPath栏    找到刚才复制的Android.mk文件,点击OK之后就在build.gradle(Model:App)的android{}中自动生成了externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } }

  externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
 }

九,最后在MainActivity中加载我们生成的动态库:

猜你喜欢

转载自blog.csdn.net/ezconn/article/details/82529101