- Java调用C代码的各种情况
下面NativeMethord类中的方法跟C代码里面的方法相对应。
Java代码:
public class NativeMethord {
static {
System.loadLibrary("native_jni");
}
public static native int add(int x, int y);
public static native String getString(String string);
public static native int[] increaseArrayEles(int[] intArray);
public static native int checkPssword(String password);
}
C代码:
C代码中的方法中(JNIEnv *env,
jobject jobject1)这两个参数必不可少,java传过来的参数,按顺序接在后面
//将java中的String类型转换为C语言中的jstring
char *_JString2CStr(JNIEnv *env, jstring jstr) {
char *rtn = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String");
jstring strencode = (*env)->NewStringUTF(env, "GB2312");
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid, strencode);
jsize alen = (*env)->GetArrayLength(env, barr);
jbyte *ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
if (alen > 0) {
rtn = (char *) malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
(*env)->ReleaseByteArrayElements(env, barr, ba, 0);
return rtn;
}
/*
*对应getString方法,接收Java中传过来的字符串,然后跟C代码里面的字符串进行拼接之后返回给Java
*
* Class: com_picovr_javacall_NativeMethord
* Method: getString
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_picovr_javacall_NativeMethord_getString
(JNIEnv *env, jobject jobject1, jstring jstring1) {
//将Java中的String类型转换成jstring类型
char *from_java = _JString2CStr(env, jstring1);
//声明一个C代码种生成的字符串用于跟Java中的字符串拼接
char *from_c = "add I am from C !";
//把两个字符串拼接,并赋值给第一个变量
strcat(from_java, from_c);
//返回拼接之后的字符串
return (*env)->NewStringUTF(env, from_java);
}
/*
*接收Java传过来的一个数组,将数组中的每一个数都加10,并将这个数组返回
*
* Class: com_picovr_javacall_NativeMethord
* Method: increaseArrayEles
* Signature: ([I)[I
*/
JNIEXPORT jintArray JNICALL Java_com_picovr_javacall_NativeMethord_increaseArrayEles
(JNIEnv *env, jobject jobject1, jintArray jArr) {
//获得Java中传过来的数组的长度
jsize length = (*env)->GetArrayLength(env, jArr);
//将Java中的数组赋值给一个指针
jint *intArray = (*env)->GetIntArrayElements(env, jArr, JNI_FALSE);
//将数组中的每个元素+10
for (int i = 0; i < length; ++i) {
*(intArray + i) += 10;
}
return jArr;
}
/*
*接收Java中传过来的字符串密码,用C校验这个密码
*
* Class: com_picovr_javacall_NativeMethord
* Method: checkPssword
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_picovr_javacall_NativeMethord_checkPssword
(JNIEnv *env, jobject jobject1, jstring jstring1) {
//C中写死的密码
char *origin = "123456";
//将Java中传过来的字符串转为C中的char指针
char *fromUser = _JString2CStr(env, jstring1);
//比较两个字符串是否相同
int result = strcmp(origin, fromUser);
return result;
}