美文网首页
Android NDK 快速集成

Android NDK 快速集成

作者: cody_so_lucky | 来源:发表于2018-09-14 19:31 被阅读8次

    内容: 在现有项目中加入NDK, 从.so中获取字符串

    工作环境:

    macOS 10.13.6

    Android Studio 3.1.3

    步骤:

    安装NDK

    image.png image.png image.png

    点OK后, 等待安装完成.

    在build.gradle(Module:app) 中

    android {
    ...
        defaultConfig {
    ...
            ndk{
                moduleName "ndkdemo"
                abiFilters "armeabi-v7a", “x86”    //.so的目标编译平台
            }
    ...
        }
    }
    

    建立工具类NDKUtil

    public class NDKUtil {
    
        static {
    
            System.loadLibrary(“ndkdemo”*)*;    //动态库.so的文件名, 不用加lib前缀
    
        }
    
        public static native String getString();
    
    }
    

    生成.h头文件

    点击 build -> Make Project

    进入目录
    [项目名]/app/build/intermediates/class/debug/com/找到NDKUtil.class文件

    image.png

    右键点击文件

    image.png

    打开terminal, 输入cd空格, 黏贴上地址, 删除debug之后的字符, 进入debug目录, 回车.

    输入命令 javah -jni 包名.类名 (下图示例)

    image.png

    成功后进入debug目录中, 会获得.h文件

    image.png image.png

    该自动生成的文件不用进行任何修改.


    建立cpp文件

    实现该.h头文件, 文件名可随意设置, 后面用Android.mk文件关联

    #include "com_cody_ndksimpledemo_NDKUtil.h" //引入.h头文件

    //实现.h中的方法

    JNIEXPORT jstring JNICALL Java_com_cody_ndksimpledemo_NDKUtil_getString

        (JNIEnv *env, jclass type) {
    
    return env->NewStringUTF("Hello NDK");
    

    }

    到以下目录下建立文件夹jni

    [项目文件夹]/app/src/main/jni

    将生成的.h移动到该文件夹中

    建立 Android.mk

    在jni文件夹下建立Android.mk

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := ndkdemo
    
    LOCAL_SRC_FILES := demo.cpp
    
    include $(BUILD_SHARED_LIBRARY)
    

    LOCAL_MODULE 为gradle中设置的moduleName

    LOCAL_SRC_FILES 实现.h的C++文件名

    在gradle中添加:

    android {
    ...
        externalNativeBuild {
            ndkBuild {
                path 'src/main/jni/Android.mk’      //Android.mk文件所在的位置
            }
        }
    ...
    }
    

    加入调试代码

    Log.d("NDK Demo", NDKUtil.getString());
    

    运行成功的话就会打印出cpp中设定的字符了

    image.png

    那么在.so去哪里了呢, 其实已经自动打包到apk中了, 可以使用自带的Analyze APK工具查看

    image.png

    .apk的位置在 app/build/outputs/apk/debug/app-debug.apk

    如果没找到的话可能是因为打开了Instant Run的原因, 只要点Build -> Build APK(s), 就生成了


    image.png

    关于Android Studio 提示错误的问题:

    Cannot resolve corresponding JNI function *****
    
    image.png

    这个虽然不影响项目运行, 但是强迫症总看的不舒服, 经过查询, 这个是Android Studio的BUG, google 官方邮件组给的回答(https://issuetracker.google.com/issues/78095963#comment2)是将会在3.2时修复该问题, 所以临时的解决方法就是在class加上

    @SuppressWarnings("JniMissingFunction")
    

    等BUG修复了再删除了.

    github:
    https://github.com/codysss/ndksimpledemo

    相关文章

      网友评论

          本文标题:Android NDK 快速集成

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