Android JNI C/C++调用Java方法细节
mob 发布于 2023-06-30

1、在Android环境下,JNI中的JNI_CreateJavaVM会报错误,java error: undefined reference to 'JNI_CreateJavaVM',应该改用JNI_OnLoad函数。

2、 jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)中的sig的叫法是签名,对应的是Java类里面的方法的参数(参考签名类型对应表),例如定义一个ImageHelper类

有个ShowBitmap的方法,

public class ImageHelper
{
    public void ShowImage(Bitmap bitmap);
}

对应的C/C++代码里面的调用

jclass gcls = env->FindClass("com/example/ImageHelper");
    if (gcls == nullptr) {
        return -1;
    }

    jmethodID g_mid = env->GetMethodID(gcls, "ShowImage", "(Landroid/graphics/Bitmap;)V");

"(Landroid/graphics/Bitmap;)V",括号后面的V代表返回是void,如果返回是int,则用"(Landroid/graphics/Bitmap;)I",括号中的表示参数,对应java方法中的Bitmap类型,L开头,加上完整的包(import android.graphics.Bitmap),点号用斜杠替代,如果多个参数可用";"隔开,如

"(Ljava/lang/String;Landroid/graphics/Bitmap;)V",则代表了两个参数顺序和方法中的参数顺序一致。

 

签名类型对应表

Java类型 签名类型
boolean Z
byte B
char C
short S
int I
long J
float F
double D
数组(例如int arr[]) 数组 [类型签名, 比如 [I
L全限定名;比如String, 其签名为Ljava/lang/util/String;

 

 

mob
关注 私信
文章
61
关注
0
粉丝
0