java调用c小案例

java调用c执行加法运算

新建JNI一个类

public class JNI {
    {
        System.loadLibrary("jni");
    }
    /**
     * 让c代码做加法运算,把结果返回
     */
    public native int add(int x,int y);

    /**
     *从java中 传入字符串,c代码进行拼接
     * @param s from java
     * @return from java add from c
     */
    public native String sayHello(String s);

    /**
     * 让c代码每个元素+10
     * @param intArray
     * @return
     */
    public native int [] increaseArrayEles(int[] intArray);

    /**
     * 应用:检查密码是否正确,如果正确返回200,否则返回400
     */
    public native int checkPwd(String pwd);
}

修改Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    :=jni
LOCAL_SRC_FILES :=jni.c
LOCAL_LDLIBS := -ljnigraphics -llog
include $(BUILD_SHARED_LIBRARY)

生成头文件
javah -jni 包名.JNI,具体方法上篇文章讲过

jni.c方法

//jint返回值
JNIEXPORT jint JNICALL Java_com_peakmain_ndkproject_project_JNI_add
        (JNIEnv *env, jobject jobject1, jint jint1, jint jint2) {
    int result = jint1 + jint2;
    return result;
}

定位到jni文件下目录,ndk-build,生成.so文件动态库

执行方法

  int result = mJNI.add(100, 1);
        Log.e("TAG",result+"");

java判断密码是否正确

/**
 * 工具函数
 * 把一个jstring转换成一个c语言的char* 类型.
 */
char* _JString2CStr(JNIEnv* env, jstring jstr) {

    char* rtn;
    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;
}
JNIEXPORT jint JNICALL Java_com_peakmain_ndkproject_project_JNI_checkPwd
        (JNIEnv *env, jobject jobject1, jstring js){
    //1. 将jString转换为char*
    char* cs = _JString2CStr(env, js);
    char* pwd = "123456";
    //2. 比较两个字符串是否相等
    int result = strcmp(cs, pwd);
    //3. 根据比较的结果返回不同的值
    if(result==0) {
        return 200;
    }
    return 400;
}

执行方法

  int result = mJNI.checkPwd("123456");
        Log.e("TAG",result+"");

你可能感兴趣的:(java调用c小案例)