JNI调用c基本用法

来源:互联网 发布:陕西软件考试网 编辑:程序博客网 时间:2024/05/21 22:43
// 静态方法 jclass
JNIEXPORT jstring JNICALL Java_JniMain_getStringFromC
(JNIEnv * env, jclass jclz) {
return (*env)->NewStringUTF(env, "C string");
}

// 非静态方法 jobject
JNIEXPORT jstring JNICALL Java_JniMain_getStringFromC2
(JNIEnv * env, jobject jobj) {
return (*env)->NewStringUTF(env, "C string2");
}

//访问非静态域 
JNIEXPORT jstring JNICALL Java_JniMain_accessField
(JNIEnv * env, jobject jobj) {
// jclass
jclass jclz = (*env)->GetObjectClass(env, jobj);

// fieldId 属性名称,属性签名
jfieldID fid = (*env)->GetFieldID(env, jclz, "key", "Ljava/lang/String;");
// key -> dongNao key

// 得到key 对应的值
// GetXXXField
jstring jstr = (*env)->GetObjectField(env, jobj, fid);

// jni -> c
char * c_str = (*env)->GetStringUTFChars(env, jstr, NULL);

char text[30] = "test";
// 生成新的字符串 dongNao key
strcat(text, c_str);

// C -> jni
jstring new_str = (*env)->NewStringUTF(env, text);

//setXXXField
(*env)->SetObjectField(env, jobj, fid, new_str);

(*env)->ReleaseStringChars(env, new_str, c_str);

return new_str;
}


JNIEXPORT void JNICALL Java_JniMain_accessStaticField
(JNIEnv *env, jobject jobj) {
// jclass
jclass jclz = (*env)->GetObjectClass(env, jobj);

// fieldId 属性名称,属性签名
jfieldID fid =  (*env)->GetStaticFieldID(env, jclz, "count", "I");

if (fid == NULL)
{
printf("fid is null");
}
jint count = (*env)->GetStaticIntField(env, jclz, fid);
count++;

(*env)->SetStaticIntField(env, jclz, fid, count);
}