NDK学习 登录逻辑 C调用java方法

1.登录逻辑

#include<stdio.h>
#include<jni.h>
#include"cn_itcast_login_LoginActivity.h"
#include <android/log.h>
#include<malloc.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

/**
 * 返回值 char* 这个代表char数组的首地址
 *  Jstring2CStr 把java中的jstring的类型转化成一个c语言中的char 字符串
 */
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"); //参数Strng 返回byte数组
	 jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
	 jsize   alen   =   (*env)->GetArrayLength(env,barr);
	 jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
	 if(alen   >   0)
	 {
	  rtn   =   (char*)malloc(alen+1);         //"\0"
	  memcpy(rtn,ba,alen);
	  rtn[alen]=0;
	 }
	 (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
	 return rtn;
}
int login(char* username, char* pwd){//具体登录逻辑
  // 连接网络发送数据给服务器,
  // username "zhangsan" pwd "123"
  char* rightname ="zhangsan";
  char* rightpwd ="123";
  int i=0;
  for(;username[i]!='\0';i++){//判断两个字符串是否相等
     if(username[i]!=rightname[i] )
      return 404;
  }
   return 200;
}


JNIEXPORT jint JNICALL Java_cn_itcast_login_LoginActivity_call_1login
  (JNIEnv * env , jobject obj , jstring jname, jstring jpwd){
	char* cname = Jstring2CStr(env,jname);
	char* cpwd = Jstring2CStr(env,jpwd);
	LOGI("name =%s",cname);
	LOGI("pwd =%s",cpwd);

	return login(cname,cpwd);
}


2.C调用java方法

#include<stdio.h>
#include<jni.h>
#include"cn_itcast_ndkcallback_DataProvider.h"
#include"cn_itcast_ndkcallback_DemoActivity.h"
#include <android/log.h>
#include<malloc.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DataProvider_callmethod1
  (JNIEnv * env, jobject obj){
	//在c代码里面调用java代码里面的方法
	// java 反射
    //1 . 找到java代码的 class文件
	//    jclass      (*FindClass)(JNIEnv*, const char*);
	jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
	if(dpclazz==0){
		LOGI("find class error");
		return;
	}
	LOGI("find class ");

	//2 寻找class里面的方法 用javap方法
	//   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
	//参数说明:env虚拟机 dpclazz 类 "hellofromjava"方法名 ()V返回类型 空参数 空方法
	jmethodID method1 = (*env)->GetMethodID(env,dpclazz,"helloFromJava","()V");
	if(method1==0){
		LOGI("find method1 error");
		return;
	}
	LOGI("find method1 ");
	//3 .调用这个方法 执行了java的方法
	//    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
	(*env)->CallVoidMethod(env,obj,method1);
}

JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DataProvider_callmethod2
  (JNIEnv * env, jobject obj){
	// java 反射
    //1 . 找到java代码的 class文件
	//    jclass      (*FindClass)(JNIEnv*, const char*);
	jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
	if(dpclazz==0){
		LOGI("find class error");
		return;
	}
	LOGI("find class ");

	//2 寻找class里面的方法
	//   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
	//两个int类型的参数 返回一个int类型
	jmethodID method2 = (*env)->GetMethodID(env,dpclazz,"Add","(II)I");
	if(method2==0){
		LOGI("find method2 error");
		return;
	}
	LOGI("find method2 ");
	// 3 调用这个方法
	//    jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
	//3  5 方法的两个参数
	int result = (*env)->CallIntMethod(env,obj,method2,3,5);
	LOGI("c code  RESULT = %d",result);
}


JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DataProvider_callmethod3
  (JNIEnv * env , jobject obj){
	  //1 . 找到java代码的 class文件
		//    jclass      (*FindClass)(JNIEnv*, const char*);
		jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
		if(dpclazz==0){
			LOGI("find class error");
			return;
		}
		LOGI("find class ");

		//2 寻找class里面的方法
		//   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
		jmethodID method3 = (*env)->GetMethodID(env,dpclazz,"printString","(Ljava/lang/String;)V");
		if(method3==0){
			LOGI("find method3 error");
			return;
		}
		LOGI("find method3 ");

		//3 .调用这个方法
		//    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
		(*env)->CallVoidMethod(env,obj,method3,(*env)->NewStringUTF(env,"haha in c"));

}

JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DataProvider_callmethod4
  (JNIEnv * env, jobject obj){
	  //1 . 找到java代码的 class文件
		//    jclass      (*FindClass)(JNIEnv*, const char*);
		jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
		if(dpclazz==0){
			LOGI("find class error");
			return;
		}
		LOGI("find class ");

		//2 寻找class里面的方法
		//   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
		// 注意 :如果要寻找的方法是静态的方法 那就不能直接去获取methodid
		//jmethodID method4 = (*env)->GetMethodID(env,dpclazz,"printStaticStr","(Ljava/lang/String;)V");
		//    jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
		jmethodID method4 = (*env)->GetStaticMethodID(env,dpclazz,"printStaticStr","(Ljava/lang/String;)V");
		if(method4==0){
			LOGI("find method4 error");
			return;
		}
		LOGI("find method4 ");

		//3.调用一个静态的java方法
		//    void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
		(*env)->CallStaticVoidMethod(env,dpclazz,method4,(*env)->NewStringUTF(env,"static haha in c"));
}





//obj DemoActivity
 JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DemoActivity_call_1dp_1method1
  (JNIEnv * env, jobject obj){
	//在c代码里面调用java代码里面的方法
		// java 反射
	    //1 . 找到java代码的 class文件
		//    jclass      (*FindClass)(JNIEnv*, const char*);
		jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
		if(dpclazz==0){
			LOGI("find class error");
			return;
		}
		LOGI("find class ");

		//2 寻找class里面的方法
		//   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
		jmethodID method1 = (*env)->GetMethodID(env,dpclazz,"helloFromJava","()V");
		if(method1==0){
			LOGI("find method1 error");
			return;
		}
		LOGI("find method1 ");
		//3 .调用这个方法 创建一个新的obj对象?
		//    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
		//    jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...);
		//  jobject     (*AllocObject)(JNIEnv*, jclass);
		jobject dpobj= (*env)->AllocObject(env,dpclazz);

		(*env)->CallVoidMethod(env,dpobj,method1);
}











package cn.itcast.ndkcallback;

public class DataProvider {
	//C调用java空方法
	public void helloFromJava(){
		
		System.out.println("hello from java");
	}
	//C调用java中的带两个int参数的方法
	public int Add(int x,int y){
		int result = x+y;
		System.out.println("java result"+ result);
		return result;
	}
	//C调用java中参数为string的方法
	public void printString(String s){
		System.out.println("java "+ s);
	}
	
	public static void printStaticStr(String s){
		System.out.println("java static"+ s);
	}
	
	

	//让c代码调用对应的java代码
	public native void callmethod1();
	public native void callmethod2();
	public native void callmethod3();
	//调用一个静态的c代码
	public native void callmethod4();
}




posted @ 2012-11-13 20:05  sfshine  阅读(410)  评论(0编辑  收藏  举报