因为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
在开头的时候用,要不只有一个函数是有用的!