completing its build.
从系统查找依赖库
find_library( # Sets the name of the path variable.
#log日志库
log-lib
Specifies the name of the NDK library that
you want CMake to locate.
log )
Specifies libraries CMake should link to your target library. You
can link multiple libraries, such as libraries you define in this
build script, prebuilt third-party libraries, or system libraries.
库的依赖
target_link_libraries( # Specifies the target library.
native-lib
Links the target library to the log library
included in the NDK.
${log-lib} )
- native-lib.cpp
#include <jni.h>
#include
extern “C” JNIEXPORT jstring JNICALL
Java_com_kongge_ndktest_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = “Hello from C++”;
return env->NewStringUTF(hello.c_str());
}
- build.gradle
…
android {
defaultConfig {
externalNativeBuild {
cmake {
cppFlags “” // 命令参数,非必须
}
}
}
externalNativeBuild {
cmake {
path “src/main/cpp/CMakeLists.txt” // 指定了该文件的路径,必须
version “3.10.2” // 支持的最低版本,非必须
}
}
}
5.构建或者运行之后,会生成对应的so文件
三:现有项目手动集成NDK
- 创建存放c文件的目录
src/mian 目录上右键->new->Directory->jni,创建c文件,我这里创建DataEncryption.cpp
- 新建CMakeLists.txt
这个位置可以随意放,我是在app根目录或者module的根目录创建的CMakeLists.txt文件,后面可以在build.gradle里面配置路径。
CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.4.1)
add_library(DataEncryptionLib SHARED src/main/jni/DataEncryption.cpp )
- 在build.gradle中配置CMakeLists.txt的路径。
app根目录或者module根目录下的build.gradle中配置:
android {
…
externalNativeBuild {
cmake {
// 路径是ModuleName/CMakeLists.txt,则path ‘CMakeLists.txt’
// 如果路径是ModuleName/src/main/cpp/CMakeLists.txt,则path ‘src/main/cpp/CMakeLists.txt’
path ‘CMakeLists.txt’
}
}
}
- 新建java文件,用于调用so方法。
package com.kongge.dataencryption.util;
public class DataEncryptionUtil {
static {
System.loadLibrary(“DataEncryptionLib”);
}
// 加密
public static String encryptData(String data) {
return encryptString(data);
}
// 解密
public static String decryptData(String data) {
return decryptString(data);
}
private static native String encryptString(String string);
private static native String decryptString(String string);
}
- 此时native里面的方法是红色的,Alt+Enter会提示"Create function Java_xxx",会自动创建头文件。也可以使用javah来创建头文件,将头文件放到jni目录下。
com_kongge_dataencryption_util_DataEncryptionUtil.h内容如下
/* DO NOT EDIT THIS FILE - it is machine generated /
/ Header for class com_kongge_dataencryption_util_DataEncryptionUtil */
#ifndef _Included_com_kongge_dataencryption_util_DataEncryptionUtil
#define _Included_com_kongge_dataencryption_util_DataEncryptionUtil
#include “…/…/…/…/…/…/…/AndroidSdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/jni.h”
#ifdef __cplusplus
extern “C” {
#endif
/*
- Class: com_kongge_dataencryption_util_DataEncryptionUtil
- Method: encryptString
- Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_kongge_dataencryption_util_DataEncryptionUtil_encryptString
(JNIEnv *, jclass, jstring);
/*
- Class: com_kongge_dataencryption_util_DataEncryptionUtil
- Method: decryptString
- Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_kongge_dataencryption_util_DataEncryptionUtil_decryptString
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
- 修改DataEncryption.cpp文件
#include
#include <jni.h>
#include “com_kongge_dataencryption_util_DataEncryptionUtil.h”
/*
- Class: com_kongge_dataencryption_util_DataEncryptionUtil
- Method: encryptString
- Signature: (Ljava/lang/String;)Ljava/lang/String;
/
JNIEXPORT jstring JNICALL Java_com_kongge_dataencryption_util_DataEncryptionUtil_encryptString
(JNIEnv env, jclass obj, jstring data) {
const char str;
jboolean b = false;
str = env->GetStringUTFChars(data, &b);
if(str == NULL) {
return NULL; / OutOfMemoryError already thrown */
}
char strArr[strlen(str)];
strcpy(strArr, str);
int i = 0;
while(strArr[i] != ‘\0’) {
strArr[i] = strArr[i] + 1;
i++;
}
env->ReleaseStringUTFChars(data, str);
jstring rtstr = env->NewStringUTF(strArr);
return rtstr;
}
/*
- Class: com_kongge_dataencryption_util_DataEncryptionUtil
- Method: decryptString
- Signature: (Ljava/lang/String;)Ljava/lang/String;
/
JNIEXPORT jstring JNICALL Java_com_kongge_dataencryption_util_DataEncryptionUtil_decryptString
(JNIEnv env, jclass obj, jstring data) {
const char str;
jboolean b = false;
str = env->GetStringUTFChars(data, &b);
if(str == NULL) {
return NULL; / OutOfMemoryError already thrown */
}
char strArr[strlen(str)];
strcpy(strArr, str);
int i = 0;
while(strArr[i] != ‘\0’) {
strArr[i] = strArr[i] - 1;
i++;
}
env->ReleaseStringUTFChars(data, str);
jstring rtstr = env->NewStringUTF(strArr);
return rtstr;
}
- 运行或者构建即可。
四:遇到的问题
小结
有了这么多优秀的开发工具,可以做出更高质量的Android应用。
当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。
在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
技术进阶脑图、Android开发面试专题资料,高级进阶架构资料**这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!