您的位置 首页 java

autojs调用C

牙叔教程 简单易懂

使用场景

复用c语言, 使用so文件

环境

软件名字

软件版本

autojs

8.8.12-0

android studio

4.1.2

java

1.8.0_131

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

Android Studio 生成so文件的流程图

autojs调用C

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, 路径为
appbuildintermediatesdexdebugmergeProjectDexDebugclasses.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);  

参考文章

  • android studio ndk编译的两种方式(ndk-build和cmake)配置
  • NDK笔记(二)-在Android Studio中使用ndk-build
  • Android NDK系列一(ndk在android studio基本编译配置 ndk-build 和 cmake)
  • android studio ndk环境搭建(Android.mk方式)
  • Android Studio NDK开发之一(Java调用C的方法)

声明

部分内容来自网络

本教程仅用于学习, 禁止用于其他用途

文章来源:智云一二三科技

文章标题:autojs调用C

文章地址:https://www.zhihuclub.com/183539.shtml

关于作者: 智云科技

热门文章

网站地图