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

被折叠的 条评论
为什么被折叠?



