吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3587|回复: 6
收起左侧

[Android 原创] jni静态注册和动态注册

  [复制链接]
紫诺不离 发表于 2020-7-1 10:26

首先放上官网链接:https://developer.android.com/training/articles/perf-jni

如果您想在加载类时缓存方法 ID,并在取消加载类后重新加载时自动重新缓存方法 ID,那么初始化方法 ID 的正确做法是,将与以下类似的一段代码添加到相应类中:

java代码:

private static native void nativeInit();
//这个静态代码块是只初始化一次,提高运行效率

        static {
            nativeInit();
        }

kotlin代码

     private external fun nativeInit()

        init {
            nativeInit()
        }
    }

静态初始化程序应如下所示:

java代码

 static {
        System.loadLibrary("fubar");
    }

kotlin代码

  companion object {
        init {
            System.loadLibrary("fubar")
        }
    }

静态注册

进入到工程的src/main/java目录中
执行javah -jni com.example.myapplication.MainActivity(需要java配置好环境,com.example.myapplication.MainActivity是我java加载so的java路径)
此时会生成函数的声明,实现一下即可

动态注册

  • 提供 JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) 函数。

  • JNI_OnLoad 中,使用 RegisterNatives 注册所有原生方法。

    c++代码(c用到的函数名和c++是一样的,只是参数不同):

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
        JNIEnv* env;

        //获取env
        if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
            return JNI_ERR;
        }

  //获取class
        jclass c = env->FindClass("com/example/app/package/MyClass");
        if (c == nullptr) return JNI_ERR;

        // 方法结构体数组  
        static const JNINativeMethod methods[] = {
            {"nativeFoo", "()V", reinterpret_cast(nativeFoo)},
            {"nativeBar", "(Ljava/lang/String;I)Z", reinterpret_cast(nativeBar)},
        };
        //注册原生方法
        int rc = env->RegisterNatives(c, methods, sizeof(methods)/sizeof(JNINativeMethod));
        if (rc != JNI_OK) return rc;

        return JNI_VERSION_1_6;
    }

为什么要学习jni呢?

知道原理才能更好的去破解,不然就只能靠猜,或者一味的跟别人的教程走,没有了教程和工具就什么都不会了。同样现在很多项目都是kotlin写的,你用java的办法去搜肯定没用了。

最后附上jni.h文件,里面有详细的jni所有的方法定义和宏。在android studio的c\c++项目中也可以直接查看


jni.7z (7.1 KB, 下载次数: 22)

免费评分

参与人数 2吾爱币 +3 热心值 +2 收起 理由
sks666665 + 1 + 1 谢谢@Thanks!
涛之雨 + 2 + 1 打破0评分惨案

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hostwj 发表于 2020-7-1 12:06
感谢分享
topckey 发表于 2020-7-2 23:42
pantherTL 发表于 2020-7-4 18:00
straychild 发表于 2020-7-23 20:45
所以说要先练好内功
fcguo800 发表于 2020-7-27 15:35
厉害感谢楼主分享,好好学习一下。
mudcastles 发表于 2020-7-27 15:42
想学习Android JNI知识,还是要去Android Developer学习。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表