美文网首页
autojs调用C

autojs调用C

作者: 牙叔教程 | 来源:发表于2021-06-16 23:58 被阅读0次

    牙叔教程 简单易懂

    使用场景

    复用c语言, 使用so文件

    环境

    软件名字 软件版本
    autojs 8.8.12-0
    android studio 4.1.2
    java 1.8.0_131

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

    android studio生成so文件的流程图

    水印.png

    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);
    

    参考文章

    声明

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

    相关文章

      网友评论

          本文标题:autojs调用C

          本文链接:https://www.haomeiwen.com/subject/ohjqyltx.html