工具版本 :Android Studio Electric Eel | 2022.1.1 Patch 1
看了各路大神的文章,发现好多都是几年前的,可能与现在的工具有点出入,然后自己用新版本的工具摸索出来了,NDK 和 Cmake都是用的当前时间的最新版本,NDK 25.2+ Cmake 3.22.1。文章供大家参考。
前提:默认为NDK环境变量已搭好,然后新建了一个c++工程能跑。
第一步:android studio 左上角File -> new -> new Module ->Android Library
*注意红框里的最小sdk版本不要低于你的项目版本,不然以后会出现兼容性问题。
第二步:把项目的jni、cpp文件移动到新建的module中,下面附上jni和.cpp代码
package com.wq.jsdk;
public class JniNativeHelp {
public JniNativeHelp() {
}
// Used to load the 'jnidemo' library on application startup.
static {
System.loadLibrary("jSDK");//只需要一个so库的这里可以删
System.loadLibrary("two_jSDK");
}
public native String stringFromJNI();
public native double addMethodFromJNI(double d1,double d2);//只需要一个so库的这里可以删
public native double subMethodFromJNI(double d1,double d2);
}
*我这里做了两个so库 所以只需要一个的同学,可以把“System.loadLibrary("jSDK");”和addMethodFromJNI方法去掉
#include <jni.h>
#include <string>
#include <android/log.h>
#define TAG "-----"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__);
double sub(jdouble d1, jdouble d2);
extern "C" //下面这句很重要↓↓↓
JNIEXPORT jdouble JNICALL//Java_com_wq_jsdk_JniNativeHelp_subMethodFromJNI 这里要跟你的module包名一致,最好自动生成,再复制粘贴
Java_com_wq_jsdk_JniNativeHelp_subMethodFromJNI(JNIEnv *env, jobject thiz, jdouble d1, jdouble d2) {
return sub(d1,d2);
}
double sub(double d1, double d2) {
LOGD("执行了减法 \n")
if (d1 > d2) {
return d1 - d2;
} else if (d2 > d1) {
return d2 - d1;
} else {
return 0;
}
}
项目结构如下:
第三步: 修改CMakeLists.txt配置
cmake_minimum_required(VERSION 3.22.1)
project("jSDK")
add_library( //只需要一个so库的这里可以删
jSDK
SHARED
native-lib.cpp)
add_library(
two_jSDK
SHARED
two-native-lib.cpp)
find_library(
log-lib
log)
target_link_libraries( # Specifies the target library.//只需要一个so库的这里可以删
jSDK
${log-lib})
target_link_libraries( # Specifies the target library.
two_jSDK
${log-lib})
*我这里用的是两个.cpp文件 所以只需要一个的自行删减。
第四步:打开Module里面的build.gradle
①在android节点下的defaultConfig节点下添加代码:
externalNativeBuild {
cmake {
biFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
②在android节点下添加:
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.22.1'
}
}
③在最外层,和android节点同层级下添加代码: (这段代码是打jar包的)
task makeJar(type: Copy) {
delete 'build/TestJar.jar' //删除之前的旧jar包
from('build/intermediates/javac/release/classes/') //这里是你要打包成jar的代码
into('build/') //将jar包输出到指定目录下 (我这里也不成功)
include('classes.jar')
rename('classes.jar', 'TestJar.jar') //自定义jar包的名字(这里我rename并不成功!)
}
makeJar.dependsOn(build)
这里我rename并没有成功,最后生成的还是叫classes.jar,然后指定的生成路径也不成功,还是自己找的
第五步生成jar包和so库:Build -> ReBuild Projuct 一下项目,然后可以Build ->Make Projuct 或者也可以直接在上一步的代码左边有个绿色的小箭头也可以。跑成功后在如下路径就能找到打出的jar包和so库了:
然后新建一个项目 导入jar包和so库运行成功。
D/-----: 获取C的字符串:hello.c_str()
D/-----: 执行了第一次加法
D/-----: 执行了第二次加法
D/-----: 执行了第三次加法
D/-----: 调用C的加法 :113.3
D/-----: 执行了减法
D/-----: 调用C的减法 :1.1
打印成功。