美文网首页
Android NDK入门

Android NDK入门

作者: 年华_零落成诗 | 来源:发表于2020-02-21 16:08 被阅读0次

    本文章只限于向已存在的项目中添加c/c++代码,新建项目直接选择native C++模板即可:

    一.准备工作:

    1.新建一个项目
    2.打开MainActivity,编写代码:

    MainActivity
    我们需要构建一个叫“hello”的c/c++的文件,包含一个“sayHello”函数
    3.使用javah(jdk 1.8)命令构建.h文件:
     javah -d app/src/main/jni -classpath ./app/src/main/java com.cat.hellondk.MainActivity
    

    -d:文件输出目录
    -classpath(-cp): 类文件目录
    注意:

    • 定位到java目录即可
    • Java类格式一定要是:包名+类名

    此时在jni目录下会生成一个.h文件
    文件内容:

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

    二.添加C/C++文件,有两种方案:ndk-build和CMake方式,在此只讨论ndk-build方案

    1.右键点击app新建一个jni文件夹:
    jni folder

    会在main目录下生成一个jni文件夹

    2.新建一个hello.c文件:
    hello.c
    3.新建Android.mk文件和Application.mk文件:
    Android
    4.打开Application.mk文件,输入:
    APP_ABI := all 
    APP_PLATFORM:=android-21 #指定Android版本,非必须参数
    

    关于APP_ABI

    5.打开Android.mk文件,输入:
    LOCAL_PATH :=$(call my-dir) 
    include $(CLEAR_VARS) 
    LOCAL_MODULE := hello #生成.so包的名称,会自动加lib前缀:libhello.so
    LOCAL_SRC_FILES :=  hello.c #包含的.c文件,多文件用空格分隔
    include $(BUILD_SHARED_LIBRARY)
    
    jni
    6.右键单击app文件夹(或者点击file),点击"Link C++ Project with Gradle "
    jni
    7.弹窗选择“ndk-build”,然后选择Android.mk文件,点击ok
    jni

    gradle文件会出现以下代码:

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

    说明我们手动配置也是可以的

    8.在hello.c文件中,实现.h文件的方法:
    #include "com_cat_hellondk_MainActivity.h"
    #include <jni.h>
    #include <string.h>
    JNIEXPORT jstring JNICALL
    Java_com_cat_hellondk_MainActivity_sayHello(JNIEnv* env,jobject thiz){
        return (*env)->NewStringUTF(env,"Hello Android Ndk!");
    }
    

    如果是cpp文件:

    
    #include "com_cat_hellondk_MainActivity.h"
    #include <jni.h>
    #include <string.h>
    extern "C" JNIEXPORT jstring JNICALL
    Java_com_cat_hellondk_MainActivity_sayHello(JNIEnv* env,jobject thiz){
        return env->NewStringUTF((char *)"Hello Android Ndk!");
    }
    
    
    9.修改MainActivity,点击运行:
    MainActivity
    10.运行结果:
    Android
    11.使用ndk-build构建.so文件

    1.先把ndk-build加入到环境变量,该工具位于sdk/ndk/目录下
    2.使用终端打开jni目录
    3.执行ndk-build命令

    cd app/src/main/jni/
    ndk-build
    

    出现以下结果

    Android NDK: WARNING: APP_PLATFORM android-21 is higher than android:minSdkVersion 1 in /Users/king/Develop/StudioProjects/HelloNdk/app/src/main/AndroidManifest.xml.
    NDK binaries will *not* be compatible with devices older than android-21. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information.    
    [arm64-v8a] Compile        : hello <= hello.c
    [arm64-v8a] SharedLibrary  : libhello.so
    [arm64-v8a] Install        : libhello.so => libs/arm64-v8a/libhello.so
    [x86_64] Compile        : hello <= hello.c
    [x86_64] SharedLibrary  : libhello.so
    [x86_64] Install        : libhello.so => libs/x86_64/libhello.so
    [armeabi-v7a] Compile thumb  : hello <= hello.c
    [armeabi-v7a] SharedLibrary  : libhello.so
    [armeabi-v7a] Install        : libhello.so => libs/armeabi-v7a/libhello.so
    [x86] Compile        : hello <= hello.c
    [x86] SharedLibrary  : libhello.so
    [x86] Install        : libhello.so => libs/x86/libhello.so
    

    可以在manifest文件中添加uses-sdk标签去掉警告

    <uses-sdk
            android:maxSdkVersion="28"
            android:minSdkVersion="21" />
    

    4.在 app/src/main/libs 目录下会出现.so文件,可以正常引用:


    .so

    完结撒花

    相关文章

      网友评论

          本文标题:Android NDK入门

          本文链接:https://www.haomeiwen.com/subject/zoycqhtx.html