NDK学习 登录逻辑 C调用java方法
2012-11-13 20:05
288 查看
1.登录逻辑
2.C调用java方法
#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(); }
相关文章推荐
- NDK学习 登录逻辑 C调用java方法
- Ndk学习之JNI调用父类方法(java-->C)
- 【学习Android NDK开发】Java通过JNI调用native方法
- Android NDK (学习笔记八) —— Java代码与C代码间方法的调用
- JAVA学习脚印6: java方法调用机制
- NDK开发学习笔记(2):JNI访问Java中的方法
- 【Java学习】调用ByteBuffer.getInt()方法得到808464432
- ndk学习18: JNI之C&C++调用Java
- JNI-java本地调用方法学习第一天
- JNI学习之---用jni API 访问java对象的属性,方法,调用构造器。
- Android-java调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(二)
- 【Java学习笔记】父类引用指向子类对象时方法的调用
- JNI学习笔记3——本地方法取得Java属性/调用java方法
- Android-本地方法与Java相互调用-自定义ProgressBar(锅炉压力监测例子)/NDK-JNI开发实例(七)
- Cocos2d-x学习记录 -- Java调用C++方法
- Java学习笔记——内部类及其调用方法
- Java代理学习-创建动态类的实例对象及调用其方法
- Java的动态性支持学习六 - 方法句柄 获取和调用
- 【学习Android NDK开发】native code通过JNI调用Java方法
- NDK之java调用C方法