欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AS NDK开发(一):as构建项目

程序员文章站 2024-01-12 20:07:34
...
  • 新建一个Android Studio 工程 。新建一个Cryptor.java文件。

AS NDK开发(一):as构建项目

  • 在app/src/main/java目录下执行javah命令,生成.h头文件

AS NDK开发(一):as构建项目

  • 在app/src/main文件夹下新建一个jni文件夹,将.h头文件copy到jni目录下

AS NDK开发(一):as构建项目

  • 在jni目录下新建一个c/c++source file ,取名ndk_file_crypt.c

AS NDK开发(一):as构建项目

  • 在jni文件夹下新建Android.mk和Application.mk文件。

    Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := ndk_file_crypt
LOCAL_SRC_FILES := ndk_file_crypt.c

include $(BUILD_SHARED_LIBRARY)

Application.mk


APP_ABI := all

  • ,关联下载好的ndk包

AS NDK开发(一):as构建项目

  • 项目添加C/C++引用到Grade中

切换到Android视图,项目名右键->Link C++ Project with Gradle->选择ndk-build->然后选择Android.mk的项目路径;
AS NDK开发(一):as构建项目
AS NDK开发(一):as构建项目

  • ndk_file_crypt.c 实现上面.h文件中的方法。
#include "cn_tsou_ndkfilecrypt_ndk_Cryptor.h"

//加密
JNIEXPORT jstring JNICALL Java_cn_tsou_ndkfilecrypt_ndk_Cryptor_crypt
        (JNIEnv *env, jclass jcls, jstring jstr){
    return (*env)->NewStringUTF(env,"加密");
}

//解密
JNIEXPORT jstring JNICALL Java_cn_tsou_ndkfilecrypt_ndk_Cryptor_decrypt
        (JNIEnv *env, jclass jcls, jstring jstr){
    return (*env)->NewStringUTF(env,"解密");
}
  • 在MainActivity中调用
package cn.tsou.ndkfilecrypt;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import cn.tsou.ndkfilecrypt.ndk.Cryptor;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    /**
     * 加密
     * @param view
     */
    public void mCrypt(View view){
        String crypt = Cryptor.crypt("");
        Toast.makeText(this,crypt,Toast.LENGTH_LONG).show();
    }
    /**
     * 解密
     * @param view
     */
    public void mDecrypt(View view){
        String decrypt = Cryptor.decrypt("");
        Toast.makeText(this,decrypt,Toast.LENGTH_LONG).show();
    }
}

  • 运行效果图

AS NDK开发(一):as构建项目


  • WARNING: ABIs [arm64-v8a,armeabi-v7a,armeabi] set by ‘android.injected.build.abi’ gradle flag contained ‘ARMEABI’ not targeted by this project.

AS NDK开发(一):as构建项目

清除勾选全部即可

  • Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi
Android NDK从r16 beta1开始,不再支持 ARM5 (armeabi)。默认情况下,
Android NDK不会构建ARM5版本。如果在Application.mk配置了构建ARM5版本,会收到类似以下的警告:

Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi

Error:(82) Android NDK: Support for these ABIs will be removed in a future NDK release. 
Android系统支持的CPU架构

ARMv5:armeabi,32位
ARMv7:armeabi-v7a,32位
x86:x86,32位
MIPS:mips,32位
ARMv8:arm64-v8a,64位
MIPS64:mips64,64位
x86_64:x86_64,64
Application.mk配置APP_ABI

Application.mk的参数APP_ABI用来配置Android系统支持的CPU架构。

支持所有架构

APP_ABI := all

支持所有32位架构

APP_ABI := all32

支持指定的架构

APP_ABI := armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64

多个架构使用逗号隔开。


参考:https://github.com/android-ndk/ndk/wiki/Changelog-r16-beta1


怎样生成so库

  • 在终端进入到jni目录,输入指令 ndk-build,就会生成相应的so文件

  • 调用so文件。
    在app的bulid文件中加入如下代码,然后build project

AS NDK开发(一):as构建项目

android {
    ...
    sourceSets {
        main() {
            jniLibs.srcDirs = ['src/main/libs']
            jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
        }
    }
}

相关标签: androidStudio NDK