1.登录逻辑
[code="cpp"]#include
#include
#include"cn_itcast_login_LoginActivity.h"
#include
#include
#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方法
[code="cpp"]#include
#include
#include"cn_itcast_ndkcallback_DataProvider.h"
#include"cn_itcast_ndkcallback_DemoActivity.h"
#include
#include
#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);
}
[code="java"]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();
}