Android(2) Jni编程 静态注册so过程详记

38 篇文章 13 订阅
10 篇文章 0 订阅

推荐肉丝r0ysue课程(包含安卓逆向与js逆向):https://i-blog.csdnimg.cn/blog_migrate/eb1155e1fa99b3eb95edf8cee74866b8.png
项目源码已打包至JNI静态注册so AndroidStudio源码

环境准备

已下载好ndk,并配置好path变量

创建项目

配置External Tools 工具

只用配置一次
File -> Settings -> Tools -> External Tools 添加新工具

配置javah

Program: javah
Parameters: -v -jni -d $ContentRoot$\src\main\jni $FileClass$
Working directory: $SourcepathEntry$

在这里插入图片描述

配置ndk-build

Program: # ndk目录下ndk-build.cmd所在路径
Working directory: $ContentRoot$\src\main\

在这里插入图片描述

配置项目根目录gradle.properties

android.useDeprecatedNdk=true

配置项目根目录local.properties

(貌似有无都可)

ndk.dir=E\:\\code\\Android\\Sdk\\ndk-bundle

配置app/build.gradle

  • 在android下配置sourceSets.main
  • 在defaultConfig下配置ndk
defaultConfig {
        applicationId "com.forgo7ten.jnitest"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk {
            moduleName "MyJnia"       //生成的so文件名字,调用C程序的代码中会用到该名字
            abiFilters 'x86' // 选择打包进apk中的平台类型 , 'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
        }
    }
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }

打包多个平台so文件进入apk包中:多写几个abiFilters
在这里插入图片描述

或者多写几个ndk节点
在这里插入图片描述

        ndk {
            moduleName "MyJniaa"       //生成的so文件名字,调用C程序的代码中会用到该名字
            abiFilters 'armeabi-v7a','x86_64','arm64-v8a','x86' // 增加指定架构下的so库
            ldLibs "log"    // 额外增加log的lib库
        }

编写调用so的java文件

    static {
        System.loadLibrary("MyJnia"); // 要与app/build.gradle中moduleName相同
    }

    public static native String hello();

在这里插入图片描述

使用javah生成.h头文件

右键调用so的java类,External Tools -> javah
会自动在\src\main\jni目录下生成.h文件

创建相应C文件

//引入上面生成的头文件,并实现头文件中声明的方法
#include "com_forgo7ten_jnitest_MyJni.h"

JNIEXPORT jstring JNICALL Java_com_forgo7ten_jnitest_MyJni_hello
  (JNIEnv *env, jobject obj){//方法名是Java_包名_类名_方法名
                  char *str = "String from native C";
                  return (*env)->NewStringUTF(env, str);
              }

在这里插入图片描述

生成jni/Android.mk文件

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
# 编译的so文件的名字,编译器会自动加上lib的前缀和.so的后缀
LOCAL_MODULE :=MyJnia
# 需要编译的C/C++文件
LOCAL_SRC_FILES :=MyJnia.c
include $(BUILD_SHARED_LIBRARY)

生成jni/Application.mk文件

# 生成所有平台的so,或者指定平台'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
APP_ABI := all

编译so

  • /src/main/jni/目录下打开命令行输入ndk-build
  • 或者 在jni目录右键External Tools -> ndk-build

配置相应的activity

配置activity,调用so中的方法
在这里插入图片描述

运行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Forgo7ten

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

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

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

打赏作者

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

抵扣说明:

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

余额充值