Android JNI笔记

JNI、java native interface 。可以实现Java和C、C++之间的调用。

在Android开发中是必须要掌握的内容。

在应用开发中,编写JNI代码的注册可分为动态注册和静态注册

动态注册:

声明好方法、注意这些签名 在JNI_OnLoad中进行注册。

bash 复制代码
static const JNINativeMethod method[] = {
        {"openUrl","(Ljava/lang/String;Ljava/lang/Object;I)I", (void*)playVideo},
        {"InitView","(Ljava/lang/Object;)I", (void*)InitView},
        {"start","()I", (void*) start},
        {"getPauseStatus","()Z", (void*)getPauseStatus},
        {"onRelease","()Z", (void*)onRelease},
        {"stopVideo","()V", (void*)stopVideo},
        {"seekTo","(D)V", (void*)changeSeek},
        {"changeURL","(Ljava/lang/String;)V", (void*)changeURL},
        {"setPause","(Z)V", (void*)setPause},
        {"getSupportProcel","()Ljava/lang/String;", (void*)getSupportInfo}
};

static const char *mClassName = "com/mark/myapplication/player/core/PlayerCore";

int JNI_OnLoad(JavaVM *vm,void  *re){
    g_vm = vm;
    IPlayerPorxy::Get()->Init(vm);
    AndroidHelper::getInstance()->SetVM(g_vm);
    //获得JNIEnv
    JNIEnv *env = 0;
    int r = vm->GetEnv((void**)&env,JNI_VERSION_1_6);
    //小于0失败,等于0成功
    if(r != JNI_OK){
        return -1;
    }

    //获得class对象
    jclass jcls =  env->FindClass(mClassName);
    //动态注册
    env->RegisterNatives(jcls,method, sizeof(method)/ sizeof(JNINativeMethod));
    return JNI_VERSION_1_6;
}

静态注册:

bash 复制代码
extern "C" JNIEXPORT jstring JNICALL
Java_com_mark_myapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

JNI函数签名

https://blog.csdn.net/weixin_75102992/article/details/130771941

全局引用&局部引用&弱全局引用

https://blog.csdn.net/huangjinjin520/article/details/123288292

系统中的JNI代码模块是在哪里被加载的呢。

在zygote启动时

frameworks/base/core/jni/AndroidRuntime.cpp

bash 复制代码
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
	......
	 JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote, primary_zygote) != 0) {
        return;
    }
    onVmCreated(env);

    /*
     * Register android functions.注册JNI
     */
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }
    ..............
}

注册了framework中使用的native代码,如果自己需要添加framework的JNI,需要在这里进行添加声明

bash 复制代码
static const RegJNIRec gRegJNI[] = {
        REG_JNI(register_com_android_internal_os_RuntimeInit),
        REG_JNI(register_com_android_internal_os_ZygoteInit_nativeZygoteInit),
        REG_JNI(register_android_os_SystemClock),
        REG_JNI(register_android_util_EventLog),
        REG_JNI(register_android_util_Log),
        REG_JNI(register_android_util_MemoryIntArray),
        REG_JNI(register_android_app_admin_SecurityLog),
        REG_JNI(register_android_content_AssetManager),
        REG_JNI(register_android_content_StringBlock),
        REG_JNI(register_android_content_XmlBlock),
        ..................
        }

例如storage_StorageManager可以在storage_StorageManager.cpp可找到

bash 复制代码
//跟APP开发中的动态注册类似
static const JNINativeMethod gStorageManagerMethods[] = {
        {"setQuotaProjectId", "(Ljava/lang/String;J)Z",
         (void*)android_os_storage_StorageManager_setQuotaProjectId},
};

const char* const kStorageManagerPathName = "android/os/storage/StorageManager";

int register_android_os_storage_StorageManager(JNIEnv* env) {
    return RegisterMethodsOrDie(env, kStorageManagerPathName, gStorageManagerMethods,
                                NELEM(gStorageManagerMethods));
}

}
相关推荐
ACP广源盛139246256739 小时前
Type-C 扩展坞方案选型笔记:DP1.4 转 HDMI2.0 桥接方案评估@ACP
笔记·硬件架构·hdmi·国产芯片·扩展坞
吹什么轩10 小时前
MySQL:数据类型
android·adb
酷炫码神10 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
ss27311 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql
ss27311 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍
数据库·笔记·postgresql
造火箭11 小时前
安卓不同类型自动化测试介绍
android
摇滚侠14 小时前
《Java并发编程之美》第 4 章 Java 并发包中原子操作类原理剖析 阅读笔记 7
java·笔记·python
Rabitebla14 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
汪海游龙15 小时前
流式回复结尾的那一下闪:逐帧定位 Compose 聊天列表的三处布局跳动
android·性能优化·kotlin
深圳老胡15 小时前
STM32CubeMX 2 与 STM32CubeMX 的主要区别
笔记·stm32·单片机·代码规范