autojs调用C

牙叔教程 简单易懂

使用场景

复用c语言, 使用so文件

环境

软件名字软件版本
autojs8.8.12-0
android studio4.1.2
java1.8.0_131

以上环境配置, 百度很多,不赘述了

android studio生成so文件的流程图

在这里插入图片描述

android studio生成so文件的步骤讲解

1. 新建java类
// 1. 加载so文件
// 2. 声明本地方法

package com.yashu.usec;

public class Student {
    static {
        System.loadLibrary("soname");
    }
    public static native int doMathSum(int a,int b);
}
2. 生成头文件
cd到路径 app/src/main/java
输入命令 javah -jni com.yashu.usec.Student
会生成头文件 app/src/main/java/com_yashu_usec_Student.h
3. 编写c方法
路径: app/src/main/jni/xiaoqiang.c
4. 编写 Android.mk 和 Application.mk
// 路径 app/src/main/jni/Android.mk
   LOCAL_PATH := $(call my-dir)
   include $(CLEAR_VARS)
   LOCAL_MODULE := soname
   LOCAL_SRC_FILES := xiaoqiang.c
   include $(BUILD_SHARED_LIBRARY)
// 路径 app/src/main/jni/Application.mk
   APP_PLATFORM := android-26
   APP_ALLOW_MISSING_DEPS=true
   APP_ABI := arm64-v8a, armeabi-v7a, x86, x86_64
5. 复制头文件到 app/src/main/jni/com_yashu_usec_Student.h
6. 生成so文件
cd到路径 app/src/main/jni
命令行中输入 ndk-build
生成的so所在文件夹 app/src/main/libs
7. make project, 一共四个步骤
// 1. app的build.gradle中添加ndk配置
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    externalNativeBuild {
        ndkBuild {
            // Provides a relative path to your ndkBuild script.
            path file("src/main/jni/Android.mk")
        }
    }
    defaultConfig {
		...
    }
}
2. 点击菜单build/make project
3. 提取dex, 路径为
app\build\intermediates\dex\debug\mergeProjectDexDebug\classes.dex
4. 提取so, 我的手机是armeabi-v7a
5. 剩下的要在autojs测试

autojs调用so文件, 执行c函数

// 复制so文件到指定目录, 不需要runtime.loadDex
var jniPath = ctx.getDir("libs", android.app.Activity.MODE_PRIVATE);
log("jniPath = " + jniPath);
var dirpath = ctx.getDir("dex", android.app.Activity.MODE_PRIVATE).getAbsolutePath();
log("dirpath = " + dirpath);
copy(soPath, new java.io.File(jniPath, "libsoname.so").getAbsolutePath());
var dcl = new Packages.dalvik.system.DexClassLoader(
  dexPath,
  dirpath,
  jniPath,
  java.lang.ClassLoader.getSystemClassLoader()
);

var cls = dcl.loadClass("com.yashu.usec.Student");
var api = cls.newInstance();
let result = api.doMathSum(1, 2);
log(result);

完整源码

公众号回复 调用c

参考文章

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

在这里插入图片描述

QQ群

747748653
在这里插入图片描述

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙叔教程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值