java调用C
java中的native方法声明
public class JniController {
{
System.loadLibrary("jniLib");
}
public native int sum(int x,int y);
public native String sayHello(String s);
public native int[] executeList(int[] intArray);
public native int checkPwd(String pwd);
}
C文件中方法的实现
#include <string.h>
#include <malloc.h>
#include "com_example_jnidemo_JniController.h"
#include <android/log.h>
#define LOG_TAG "TAG_JNI"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
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;
}
JNIEXPORT jint JNICALL Java_com_example_jnidemo_JniController_sum
(JNIEnv* jniEnv, jobject jobj, jint x, jint y){
jint sum = x + y;
return sum;
};
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniController_sayHello
(JNIEnv* jniEnv, jobject jobj, jstring jstr){
char* cStr = "i am from c";
char* javaStr = _JString2CStr(jniEnv,jstr);
char* newStr = strcat(javaStr,cStr);
return (*jniEnv)->NewStringUTF(jniEnv,newStr);
};
JNIEXPORT jintArray JNICALL Java_com_example_jnidemo_JniController_executeList
(JNIEnv* jniEnv, jobject jobj, jintArray jarray){
jsize size = (*jniEnv)->GetArrayLength(jniEnv,jarray);
jint* arrayAddress = (*jniEnv)->GetIntArrayElements(
jniEnv,
jarray,
JNI_FALSE
);
int i;
for (i = 0; i < size; ++i) {
*(arrayAddress+i) +=10;
LOGD("遍历的item的值:%d",*(arrayAddress+i));
}
(*jniEnv)->ReleaseIntArrayElements(jniEnv,jarray,arrayAddress,0);
return jarray;
}
JNIEXPORT jint JNICALL Java_com_example_jnidemo_JniController_checkPwd
(JNIEnv* jniEnv, jobject jobj, jstring jstr){
char* origin = "123456";
char* inputPwd = _JString2CStr(jniEnv,jstr);
int result = strcmp(origin,inputPwd);
if(result==0){
return 200;
}
else{
return 400;
}
};
C回调Java
java中的方法
public class CallJavaController {
{
System.loadLibrary("jniCCallJavaLib");
}
public native void callBackAdd();
public native void callbackPrintString();
public native void callbackSayHello();
public int add(int x,int y){
Log.d("tag_jni","调用 add() x:" + x + " y:" + y);
return x+y;
}
public void printString(String s){
Log.d("tag_jni","C 中传递回来的字符串:" + s );
}
public static void sayHello(){
Log.d("tag_jni","C 调用了java中的静态方法" );
}
}
C文件对java方法的回调
#include "com_example_jnidemo_CallJavaController.h"
#include <android/log.h>
#define LOG_TAG "TAG_JNI"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL Java_com_example_jnidemo_CallJavaController_callBackAdd(JNIEnv* env, jobject jobj){
char* classAddress = "com/example/jnidemo/CallJavaController";
jclass jclazz = (*env)->FindClass(env,classAddress);
jmethodID jmethodId = (*env)->GetMethodID(env,jclazz,"add","(II)I");
jobject jobject1 = (*env)->AllocObject(env,jclazz);
LOGD("value= %s","测试");
(*env)->CallIntMethod(env,jobject1,jmethodId,22,33);
};
JNIEXPORT void JNICALL Java_com_example_jnidemo_CallJavaController_callbackPrintString
(JNIEnv* env, jobject jobj){
char* classAddress = "com/example/jnidemo/CallJavaController";
jclass jclazz = (*env)->FindClass(env,classAddress);
jmethodID jmethodId = (*env)->GetMethodID(env,jclazz,"printString","(Ljava/lang/String;)V");
jobject jobject1 = (*env)->AllocObject(env,jclazz);
jstring jstr = (*env)->NewStringUTF(env,"i am from c");
(*env)->CallVoidMethod(env,jobject1,jmethodId,jstr);
};
JNIEXPORT void JNICALL Java_com_example_jnidemo_CallJavaController_callbackSayHello
(JNIEnv* env, jobject jobj){
char* classAddress = "com/example/jnidemo/CallJavaController";
jclass jclazz = (*env)->FindClass(env,classAddress);
jmethodID jmethodId = (*env)->GetStaticMethodID(env,jclazz,"sayHello","()V");
(*env)->CallStaticVoidMethod(env,jclazz,jmethodId);
};