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