JNI函数动态注册以及示例

新增一个cpp

#include 
#include 

#define TAG "QLH"

//__VA_ARGS__ 代表...的可变参数
#define LogD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__);
#define LogE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__);
#define LogI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__);

//内部对应Java函数的具体实现
void func1(JNIEnv *env, jobject jobject1) {
    LogE("dynamicNative1,动态注册")
}

jstring func2(JNIEnv *env, jobject jobject1) {
    LogE("dynamicNative2,动态注册")
    return env->NewStringUTF("hello everybody 2");
}

//包名+类型
static const char *mClassName = "com/example/myapplication/DyRegister";
//映射到对应的Java函数以及签名
static const JNINativeMethod mMethods[] = {
        {"dynamicFunc1", "()V", (void *) func1},
        {"dynamicFunc2", "()Ljava/lang/String;", (void *) func2}
};

//实现jni.h的预定义函数,加载Java对应的函数,并且注册Native函数。这个函数内容是一个模板,修改必要参数就行
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {

    LogE("动态注册开始")
    JNIEnv *env = NULL;
    //获得JNIEvn
    int r = vm->GetEnv((void **) &env, JNI_VERSION_1_4);
    if (r != JNI_OK) {
        return -1;
    }
    //获取对应Java类的class
    jclass mainActivityCls = env->FindClass(mClassName);
    //注册,最后一个参数为注册的方法数,需要动态修改
    r = env->RegisterNatives(mainActivityCls, mMethods, 2);
    //如果小于0 则注册失败
    if (r != JNI_OK) {
        return -1;
    }
    LogE("动态注册结束");
    return JNI_VERSION_1_4;
}

新增一个java文件

package com.example.myapplication;

public class DyRegister {
    static {
        System.loadLibrary("dyTest");
    }

    public native void dynamicFunc1();
    public native String dynamicFunc2();
}

调用的地方

package com.example.myapplication;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class DyRegisterActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DyRegister register = new DyRegister();
        register.dynamicFunc1();
        String s = register.dynamicFunc2();
        System.out.println("运行了:"+s);
    }
}

CMake的配置

# 添加lib库
add_library(dyTest SHARED DyRegister.cpp)

# 链接到日志库 如果使用android/log.h 时需要加上
target_link_libraries(dyTest ${log-lib})

运行日志

2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: 动态注册开始
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: 动态注册结束
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: dynamicNative1,动态注册
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication E/QLH: dynamicNative2,动态注册
2023-03-27 11:50:14.422 4641-4641/com.example.myapplication I/System.out: 运行了:hello everybody 2
展开阅读全文

页面更新:2024-05-03

标签:函数   动态   示例   加载   模板   参数   类型   结束   代表   链接   日志

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top