AS NDK开发(一):as构建项目
程序员文章站
2024-01-12 20:07:34
...
- 新建一个Android Studio 工程 。新建一个Cryptor.java文件。
- 在app/src/main/java目录下执行javah命令,生成.h头文件
- 在app/src/main文件夹下新建一个jni文件夹,将.h头文件copy到jni目录下
- 在jni目录下新建一个c/c++source file ,取名ndk_file_crypt.c
-
在jni文件夹下新建Android.mk和Application.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)
APP_ABI := all
- ,关联下载好的ndk包
- 项目添加C/C++引用到Grade中
切换到Android视图,项目名右键->Link C++ Project with Gradle->选择ndk-build->然后选择Android.mk的项目路径;
- 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();
}
}
- 运行效果图
- WARNING: ABIs [arm64-v8a,armeabi-v7a,armeabi] set by ‘android.injected.build.abi’ gradle flag contained ‘ARMEABI’ not targeted by this project.
清除勾选全部即可
- 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
android {
...
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
}
上一篇: 人工智能机器人的数量未来可能超越人类