一、如何用命令生成jni头文件:
1:命令行切换到工程目录下
2:javah -classpath bin\classes -d jni [类名:com.test.xxx]
3:在jni目录查看该文件
二、jni类型签名规则:
java类型 | 类型签名 |
byte | B |
char | C |
boolean | Z |
long | J |
float | F |
double | D |
short | S |
int | I |
类 | L[类名]; |
数组 | [[元素类型签名] |
三、jni中重要的函数和方法:
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
//TODO GAME C++层初始化
return JNI_VERSION_1_6;
}
这个方法是我们在java层调用:System.loadLibrary("xxxx");函数时会触发。vm:就是我们java层的虚拟机,我们可以通过vm实现c/c++与java的交互。
例如我可以通过vm创建一个String类
JNIEnv *env;
vm->AttachCurrentThread(&env, NULL);
jclass cls = env->FindClass("java/lang/String"); // 类名
jmethodID struct = env->GetMethodID(cls, "<init>", "()V");// 通个默认的构 造方法创建String类
jobject stringObject= env->NewObject(cls, struct);
四、如何在c/c++中调用java代码:
public class Test {
public void jniTest(){
System.out.println("中文才是最屌的……");
}
}
第一步:创建要调用的类
JNIEnv *env;
vm->AttachCurrentThread(&env, NULL);
jclass cls = env->FindClass("com/tencent/Test"); // 类名
第二步:获取方法ID
JmethodID methodID env->GetMethodID(cls,"jniTest","()V");
第三步:执行要调用的方法
env->CallVoidMethod(cls ,methodID);
五、jni中如何快速实现jstring与string的转换:
1、jstring转string
std::string jstring2string(JNIEnv *env,jstring s){
jboolean isCopy;
const char* cs = env->GetStringUTFChars(s, &isCopy);
std::string c_s = cs;
env->ReleaseStringUTFChars(s, cs);
return c_s;
}
2、string转jstring
std::string string2jstring(JNIEnv *env,std::string s){
return env->NewStringUTF(s.c_str());
}