AndroidStudio JNI GetMethodID获取函数方法签名以及使用CallVoidMethod调用

本文介绍了在Android Studio中使用JNI的GetMethodID获取Java方法ID的详细步骤,包括如何构造方法签名,并通过CallVoidMethod调用该方法。内容分为两个部分:1. 获取函数ID,讲解了GetMethodID的参数和方法签名格式;2. 调用获取到的函数,展示实际调用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、获取函数ID

JNI的GetMethodID函数获取一个jmethodID时,需要传入一个方法名称和方法签名,方法名称就是在Java中定义的方法名,方法签名的格式为:(形参参数类型列表)返回值。

const char method_class_from_java[] = "org/webrtc/examples/androidnativeapi/IpeerConnectionClientObserver";

    jclass jSdkClass =(*env).FindClass(method_class_from_java);
    //jclass jSdkClass =(*env).GetObjectClass(j_listener.obj());
    if (jSdkClass == 0) {
        RTC_LOG(INFO) << "not class ";
        return;
    }


    //找到需要调用的方法ID
    //OnSignedIn_ = (*env).GetMethodID( jSdkClass,"OnSignedIn", "([Ljava/lang/String;)V");
    jmethodID OnSignedIn_ = (*env).GetMethodID( jSdkClass,"OnSignedIn", "(Ljava/util/HashMap;)V");
    if(!OnSignedIn_)
    {
        RTC_LOG(INFO) << "not function ";
    }

参考表一:

Method Descriptor

Java Language Type

“()Ljava/lang/String;

String f()

“(ILjava/lang/Class;)J

long f(int I, Class c)

“([B)V”

void f(byte[] bytes) V:返回void,[:数组

参考表二:

Field Descriptor

jni类型

Java Language Type

Z

jboolean

boolean

B

jbyte

byte

C

jchar

char

S

jshort

short

I

jint

int

J

jlong

long

F

jfloat

float

D

jdouble

double

Lfully-qualified-class-name;L类名

jobject

任何Java对象,或者没有对应java类型的对象

Ljava/lang/String;

jstring

String

Ljava/lang/Class;

jclass

Class对象

(Ljava/util/HashMap;

jobject

HashMap

(argument-types)return-type(参数类型)返回类型

jmethodID

methods方法

[I

jintArray

int[]数组

[B

jbyteArray

byte[]

2、调用获取到的函数

JNIEnv* env = webrtc::AttachCurrentThreadIfNeeded();
    std::map<std::string, std::string> strPeers;
    for (const auto& e : peers) {
        strPeers.emplace("id",std::to_string(e.first));
        strPeers.emplace("name",e.second);

    }

    webrtc::ScopedJavaLocalRef<jobject> j_stats_map =  webrtc::NativeToJavaStringMap(env, strPeers);
    (*env).CallVoidMethod(j_caller_.obj(), OnSignedIn_,  j_stats_map.obj());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值