关于Android NDK
把解压后的ndk放在自己想放的位置
环境变量:ndk根目录添加到PATH=$PATH:<ndk-root-path>
使用NDK:在自己工作目录(可以是随意位置)下创建<Test>目录,然后在<Test>目录下创建jni目录,在jni下面创建Android.mk文件和C程序文件。
下面是Android.mk文件内容(不是定的)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := CheckNetInfoJni // 模块名,最后生成libCheckNetInfoJni.so
LOCAL_SRC_FILES := CheckNetInfo.c // C程序文件
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog // 使用utils/log.h头文件
include $(BUILD_SHARED_LIBRARY)
关于C文件里面的JNI_OnLoad函数:
首先是额外的两个头文件需要加进来,android/Log.h文件后面再说
#include <jni.h>
#include "android/Log.h"
写JNINativeMethod数组:
static const JNINativeMethod gMethods[] = {
{"getNetInfoFromApnic","()Ljava/lang/String;",(void*)JNI_getNetInfoFromApnic},
};
函数签名是一个字符串:"(M)N",括号中的内容是函数的参数类型,括号后面表示函数的返回值。
具体的每一个字符的对应关系如下
字符 Java类型 C类型
V void void
Z jboolean boolean
I jint int
J jlong long
D jdouble double
F jfloat float
B jbyte byte
C jchar char
S jshort short
数组则以”["开始,用两个字符表示
[I jintArray int[]
[F jfloatArray float[]
[B jbyteArray byte[]
[C jcharArray char[]
[S jshortArray short[]
[D jdoubleArray double[]
[J jlongArray long[]
[Z jbooleanArray boolean[]
如果Java函数的参数是class,则以”L”开头,以”;”结尾,中间是用”/” 隔开的包及类名。而其对应的C函数名的参数则为jobject
一个例外是String类,其对应的类为jstring
Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject
--------------------------------------------------------------
static const JNINativeMethod gMethods[] = {
{"getNetInfoFromApnic","()Ljava/lang/String;",(void*)JNI_getNetInfoFromApnic},
};
static int regeisterMethods(JNIEnv * env){
jclass class;
static const char * const kClassName = "com/lml/jni/CheckNetInfoJni";
class = (*env)->FindClass(env,kClassName);
if(class==NULL){
return JNI_FALSE;
}
if((*env)->RegisterNatives(env,class,gMethods,sizeof(gMethods)/sizeof(gMethods[0]))!=JNI_OK){
return JNI_FALSE;
}
return JNI_TRUE;
}
jint JNI_OnLoad(JavaVM * vm, void * reserved){
JNIEnv * env = NULL;
jint result = -1;
if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_4)!=JNI_OK){
goto fail;
}
assert(env!=NULL);
if(regeisterMethods(env)<0){
goto fail;
}
result = JNI_VERSION_1_4;
fail:
return result;
}
——————————————————————————————————————————————
关于androidlog.h
#include <android/log.h>
#ifndef LOG
#define LOG "PCSC JNI Debug Infor"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG, __VA_ARGS__) //定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) //定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG, __VA_ARGS__) //定义lOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG, __VA_ARGS__) //定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL, LOG, __VA_ARGS__) //定义LOGF类型
#endif

浙公网安备 33010602011771号