`

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

 
阅读更多

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





 

分享到:
评论

相关推荐

    ndk开发,在c中调用java中的代码

    本篇文章将详细探讨如何在NDK开发中,从C/C++代码调用Java层的方法。 首先,我们需要了解Java本地接口(JNI),它是Java平台标准版的一部分,提供了与Java虚拟机(JVM)交互的能力,包括在Java代码中调用C/C++函数...

    NDK中JAVA和C互相调用

    在C/C++代码中,我们会提供这个方法的实现,并通过JNI接口调用Java代码。 在我们的例子"NDK中JAVA和C互相调用"中,我们可以看到以下步骤: 1. **JAVA调用C**: - 在Java类中声明一个native方法,例如`public ...

    Android NDK入门,C与Java的互相调用Demo

    同样,C/C++代码也可以通过JNI调用Java方法。 在“XS_NDK_CcallJava”这个示例中,我们可以预期它包含了一个简单的Java类,该类定义了一个`callFromJava()`方法,然后在C++代码中实现了这个方法。当你运行应用时,...

    qt调用JAVA文件示例

    4. **在C++中调用Java方法**:在QT项目的C++代码中,包含生成的JNI头文件,并使用QAndroidJniObject调用Java方法。下面是一个简单的例子: ```cpp #include #include #include "MyJavaClass.h" void ...

    NDK编译 JAVA JNI 原生调用

    NDK编译和JAVA JNI原生调用是Android开发中的高级技术,主要应用于游戏开发、音视频处理、图像识别等对性能要求较高的场景。 1. NDK简介: NDK提供了一套工具,让开发者可以在Android应用中使用本地代码。它包含了...

    android中用ndk编译c并用jni调用的demo源码

    这个“android中用ndk编译c并用jni调用的demo源码”提供了实践NDK和JNI集成的实例,帮助我们深入理解它们的工作原理和使用方法。 首先,NDK是Android开发的一个组成部分,它允许开发者使用C、C++语言编写部分应用...

    Android ndk cpp 线程运行 java 方法

    在这个文件中,你需要包含jni.h头文件,定义JNI函数,并实现调用Java方法的逻辑。例如: ```cpp #include #include extern "C" JNIEXPORT void JNICALL Java_...

    手势识别库:android端通过ndk打包成so库,java通过jni调用native识别方法

    本项目重点在于如何在Android端利用NDK将手势识别算法打包成SO动态链接库,并通过JNI(Java Native Interface)调用C/C++编写的原生代码来实现手势识别功能。 首先,我们要理解手势识别的基本原理。手势识别是...

    安卓NDK调用第三方动态库方法实例

    NDK允许开发者将C/C++代码编译为原生库,然后在Android应用中通过JNI(Java Native Interface)进行调用。本实例主要探讨的是如何在Android项目中使用NDK调用第三方动态库,即.so文件。 首先,理解NDK和JNI的概念至...

    java-Call-CPP.rar_C 调用java

    这里通常包括了对Java对象的访问,调用Java方法,以及执行特定的C/C++逻辑。 5. **编译C/C++代码**:使用合适的编译器(如GCC或Clang)将C/C++源文件编译为动态链接库。对于Android开发,这通常涉及到使用Android ...

    jni使用,从c代码调用java代码

    // 在这里实现你的C代码逻辑,比如调用Java方法 jclass callerClass = (*env)->GetObjectClass(env, obj); jmethodID printMethod = (*env)->GetMethodID(env, callerClass, "printMessage", "()V"); if (print...

    jni中用多线程调用java代码

    描述中提到的“在JNI中用多线程调用Java对象”,意味着在C/C++代码中创建并管理多个线程,每个线程负责调用不同的Java方法或者处理不同的Java对象。在Android中,线程管理对于优化应用性能和避免UI阻塞至关重要。...

    Android NDK开发(1)----- Java与C互相调用实例详解

    例如,当C/C++代码处理完数据后,可以通过`env->CallVoidMethod()`或类似的方法来调用Java对象的非静态方法。 ```c++ void Java_com_ljt_work_LjtndkActivity_callJNIInt(JNIEnv *env, jobject thiz, jint i) { //...

    android ndk纯c编程调用so文件

    在设备或模拟器上运行应用,Java层的`callNativeFunction()`方法将调用C/C++代码中的对应实现。 在实际开发中,可能会遇到一些挑战,如处理不同架构的设备、优化性能、调试本地代码等。NDK提供了一些工具来帮助解决...

    C++和Java互相调用实例

    6. **调用**:在Java代码中,可以像调用普通方法一样调用`callCppFunction()`,在C++的`callCppFunction`中实现的逻辑就会被执行。 在实际的JniDemo项目中,你可以找到上述步骤的完整实现,包括Java类、C++源码、...

    NDKDemo.zip

    总之,"NDKDemo.zip"是一个学习和实践C++调用Java方法的实例,涵盖了NDK和JNI的基本用法,对理解Android原生代码和Java之间的交互具有很高的价值。通过分析和运行这个示例,开发者可以深入理解NDK和JNI的工作原理,...

    NDK学习总结

    NDK(Native Development Kit)是Android开发中的一个重要工具集,它允许开发者使用C和C++等原生语言编写部分或全部应用,以实现高性能、低级硬件访问和库的使用。NDK的主要应用场景包括游戏引擎、图形处理、音视频...

    探讨如何在NDK中呼叫Java的class.rar

    在Android开发中,有时我们需要在原生C/C++代码(NDK)中调用Java的类和方法,以便利用Java的高级特性或者优化性能。这个主题涉及到Java Native Interface (JNI) 的使用,它是Java平台标准的一部分,允许Java代码和...

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    这些函数实现了Java native方法的逻辑,并可能调用到系统库或其他C/C++代码。 3. 生成的SO库(`.so`):这是编译后的动态链接库,包含了你的C/C++代码。在Android设备上运行时,这个库会被Java层加载,Java方法通过...

Global site tag (gtag.js) - Google Analytics