Android so的使用

因为Android系统的开源的原因,好多东西加在源代码中,可以通过反编译获得.
为了安全考虑,把相关内容放到cpp中.
目前的android studio 2.2.2支持cmake和ndk,相关的内容可以网上查询.
在Java层中的声明:

 public static native String desKeyFromJNI();

然后在cpp文件中添加

jstring
Java_com_pay_sdk_pay_PayConstant_desKeyFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    return env->NewStringUTF(KEY);
}

函数命名规则:
Java_packageName_className_nativeMethod

也可以定义如下:

#ifdef __cplusplus
extern "C" {
#endif
#include <jni.h>
#include <android/log.h>
#include <assert.h>
#include <stdio.h>

#define LOG_TAG "steven"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

#define KEY "66af8593f42b01b3ee815ad8be980e3c"
#define API_ADDRESS "https://api.jtpay.com/"

extern JNIEXPORT jstring JNICALL
        native_apiAddressFromJNI(
        JNIEnv *env,
        jobject /* this */);
extern JNIEXPORT jstring JNICALL
        native_desKeyFromJNI(
        JNIEnv *env,
        jobject /* this */);
JNINativeMethod gMethods[] = {
        {"desKeyFromJNI",     "()Ljava/lang/String;",
                (void *) native_desKeyFromJNI},
        {"apiAddressFromJNI", "()Ljava/lang/String;",
                (void *) native_apiAddressFromJNI},
};

JNIEXPORT jstring JNICALL
native_desKeyFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    return env->NewStringUTF(KEY);
}
JNIEXPORT jstring JNICALL
native_apiAddressFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    return env->NewStringUTF(API_ADDRESS);
}

static int registerNativeMethods(JNIEnv *env, const char *className, JNINativeMethod *gMethods,
                                 int numMethods) {
    LOGD("nativeIm: registerNativeMethods()");
    int res = 0;
    jclass clazz;
    clazz = (*env).FindClass(className);
    if (clazz == NULL) {
        return JNI_FALSE;
    }
    if ((res = (*env).RegisterNatives(clazz, gMethods, numMethods)) < 0) {
        LOGD("nativeIm: registerNativeMethods()-----------FAIL, res = %d", res);
        return JNI_FALSE;
    }
    (*env).DeleteLocalRef(clazz);

    return JNI_TRUE;
}
static int registerNatives(JNIEnv *env) {
    LOGD("nativeIm: registerNatives()");
    if (!registerNativeMethods(env, "com/pay/sdk/pay/PayConstant", gMethods,
                               sizeof(gMethods) / sizeof(gMethods[0]))) {
        return JNI_FALSE;
    }
    return JNI_TRUE;
}

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
    LOGD("nativeIm: JNI_OnLoad()");
    JNIEnv *env = NULL;
    jint result = -1;

    if ((*vm).GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
        goto bail;
    }
    assert(env != NULL);

    if (!registerNatives(env)) {
        goto bail;
    }

    result = JNI_OK;

    bail:
    LOGD("JNI_OnLoad, result = %d", result);
    return result;
}

#ifdef __cplusplus
}
#endif

这个要注意

#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif

在开头的时候用,要不只有一个函数是有用的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值