二、JNI生成so之c与java方法互调

C与Java方法互调
1   编写工具类 
public class NdkJniUtils {
    static {
        System.loadLibrary("testJni");   //defaultConfig.ndk.moduleName
    }
    public native String getStringC();
    //调用c的加密
    public native String encrypt(String content);
    //调用c的解密
    public native String decrypt(String content);
    //调用c的无返回值解密
    public native void voidDecrypt(String content);
    //调用c的md5加密
    public native String md5Encrypt(String content);


    public native String getNativeMethod(String content,int i,boolean b,double d,float f,char c);

    //c调用java的静态方法加密
    public static String encrypt(String key,String platinText)throws Exception{
        Log.e("encrypt",platinText);
        return platinText+"111";
    }
    //c调用java的静态方法解密
    public static String decrypt(String key,String cryptedText)throws Exception{
        Log.e("decrypt",cryptedText);
        return cryptedText.substring(0,cryptedText.length()-3);
    }
    //c调用java的实例方法解密
    public void voidDecrypt(String key,String cryptedText)throws Exception{
        Log.e("voidDecrypt",cryptedText);
    }
}
2   生成.h文件,创建一个.c文件

.c内容:
#include "com_ywj_demojni_NdkJniUtils.h"
#include <stdlib.h>
const char *DES_KEY = "12345678912345678912345678912345";
JNIEXPORT jstring JNICALL Java_com_ywj_demojni_NdkJniUtils_getStringC
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"我来自c");
}
JNIEXPORT jstring JNICALL Java_com_ywj_demojni_NdkJniUtils_encrypt
        (JNIEnv *env, jclass jclass1, jstring jstr)
{
    if (jstr == NULL) {
        return NULL;
    }
    jstring key;
    jstring result;
    jclass AESencrypt;
    jmethodID mid;

    AESencrypt = (*env)->FindClass(env, "com/ywj/demojni/NdkJniUtils");
    if (NULL == AESencrypt) {
        return NULL;
    }
    mid = (*env)->GetStaticMethodID(env, AESencrypt, "encrypt",
                                    "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
    if (NULL == mid) {
        (*env)->DeleteLocalRef(env, AESencrypt);
        return NULL;
    }
    key = (*env)->NewStringUTF(env, DES_KEY);
    result = (*env)->CallStaticObjectMethod(env, AESencrypt, mid, key, jstr);
    (*env)->DeleteLocalRef(env, AESencrypt);
    (*env)->DeleteLocalRef(env, key);
    return result;
}

JNIEXPORT jstring JNICALL Java_com_ywj_demojni_NdkJniUtils_decrypt
        (JNIEnv *env, jclass jclass1, jstring jstr)
{
    if (jstr == NULL) {
        return NULL;
    }
    jstring key;
    jstring result;
    jclass AESencrypt;
    jmethodID mid;

    AESencrypt = (*env)->FindClass(env, "com/ywj/demojni/NdkJniUtils");
    if (NULL == AESencrypt) {
        return NULL;
    }
    mid = (*env)->GetStaticMethodID(env, AESencrypt, "decrypt",
                                    "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
    if (NULL == mid) {
        (*env)->DeleteLocalRef(env, AESencrypt);
        return NULL;
    }
    key = (*env)->NewStringUTF(env, DES_KEY);
    result = (*env)->CallStaticObjectMethod(env, AESencrypt, mid, key, jstr);
    (*env)->DeleteLocalRef(env, AESencrypt);
    (*env)->DeleteLocalRef(env, key);
    return result;
}
3   Activity中使用
        mTextView = (TextView) this.findViewById(R.id.test);
        String str="123456";
        NdkJniUtils util = new NdkJniUtils();
        String encrypt=util.encrypt(str);
        String decrypt=util.decrypt(encrypt);

        mTextView.setText(util.getStringC()+"\n"
                +"原字符串:"+str+"\n"
                +"加密  后:"+encrypt+"\n"
                +"解密  后:"+decrypt
        );
4   编译运行即可

猜你喜欢

转载自blog.csdn.net/u011106915/article/details/80266024