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; |