Android 下 JNI 开发

3.C语言完整代码

#include "com_atguigu_checkpassword_MainActivity.h"

#include <stdio.h>

#include <stdlib.h>

 

 

/**

 * 把一个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");

 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;

}

 

/**

 * 校验密码是否正确,正确返回200,错误返回400

 */

int login(char* password){

    //校验密码

    //原始密码,服务器的密码

    char* originPassword = "123";

    //比较密码

    int isSame = strcmp(password,originPassword);

    if(isSame ==0)

    {

       return 200;

    }

 

    return 400;

 

 

}

 

JNIEXPORT jint JNICALL Java_com_atguigu_checkpassword_MainActivity_login

  (JNIEnv *env, jobject obj, jstring jPassword){

//jstring转换成char*

char* cStr = _JString2CStr(env,jPassword);

//登录

return login(cStr);

 

}

 

 

12_C语言回调java方法-50

 

C调用java空方法

public void helloFromJava(){

}

C调用java中的带两个int参数的方法

public int add(int x,int y) {

}

C调用java中参数为string的方法

public void printString(String s){

}

 

1.创建工程:CallbackJavaMethod

2.创建Java代码JNI.java

 

package com.atguigu.callbackjavamethod;

 

public class JNI {

{

System.loadLibrary("CallbackJavaMethod");

}

 

// C调用java中的带两个int参数的方法

public int add(int x, int y) {

return x + y;

}

 

// C调用java中参数为string的方法

public void printString(String s) {

System.out.println("java中输入的:" + s);

}

 

// C调用java空方法

public void helloFromJava() {

System.out.println("helloFromJava()");

}

 

/**

 * 调用C语言代码,C代码回调helloFromJava方法

 */

public native void callbackHelloFromJava();

 

/**

 * 调用C语言代码,C代码回调add方法

 */

public native void callbackAdd();

 

/**

 * 调用C语言代码,C代码回调printString方法

 */

public native void callbackPrintString();

}

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。