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

来源:互联网 发布:人工智能开发入门 编辑:程序博客网 时间:2024/04/27 13:44

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