1.调用的流程
2.开发流程
c/c++文件 java与jni互调例子
#include#include #include #include jint addNumber(JNIEnv *env,jclass clazz,jint a,jint b){ return a+b; } jint subNumber(JNIEnv *env,jclass clazz,jint a,jint b){ return a-b; } jint mulNumber(JNIEnv *env,jclass clazz,jint a,jint b){ return a*b; } jint divNumber(JNIEnv *env,jclass clazz,jint a,jint b){ return a/b; } JNIEXPORT jint JNI_onLoad(JavaVM* vm, void* reserved){ //1.java调用jni 这里采用动态注册的方式 __android_log_print(ANDROID_LOG_DEBUG,"JNITag","enter jni_onload");//打印日志 JNIEnv* env = NULL; jint result = -1; // 判断是否正确 if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_6)!= JNI_OK){ return result; } //注册四个方法,注意签名 const JNINativeMethod method[]={ {"add","(II)I",(void*)addNumber}, {"sub","(II)I",(void*)subNumber}, {"mul","(II)I",(void*)mulNumber}, {"div","(II)I",(void*)divNumber} }; //找到对应的JNITools类 jclass jClassName=(*env)->FindClass(env,"com/example/jnidemo/JNITools"); //开始注册 jint ret = (*env)->RegisterNatives(env,jClassName,method, 4); //2.jni调用java方法 类似反射 jmethodID constructor = (*env)->GetMethodID(env, jClassName, " ", "()V"); jobject obj = (*env)->NewObject(env, jClassName, constructor); jmethodID getJavaInfo = (*env)->GetMethodID(env, jClassName, "getJavaInfo","()Ljava/lang/String;"); if(getJavaInfo == NULL) { return (*env)->NewStringUTF(env,"find method error"); } jstring infos = (*env)->CallObjectMethod(env,obj, getJavaInfo); const char *resultChar = (*env)->GetStringUTFChars(env, infos, NULL); //释放资源 (*env)->DeleteLocalRef(env, jClassName); (*env)->DeleteLocalRef(env, obj); (*env)->DeleteLocalRef(env, infos); __android_log_print(ANDROID_LOG_INFO,"test","value is %sn",resultChar); // %c 一个字符(char) // %d 有符号十进制整数(int) // %e 浮点数、e-记数法 // %f 单精度浮点数(默认float)、十进制记数法(%.nf 这里n表示精确到小数位后n位.十进制计数) // %i 有符号十进制数(与%d相同) // %p 指针 // %s 对应字符串char*(%S 对应宽字符串WCAHR*(%u 无符号十进制整数(unsigned int) // %% 打印一个百分号 //如果注册失败,打印日志 if (ret != JNI_OK) { __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "jni_register Error"); return -1; } return JNI_VERSION_1_6; }
点击下载 用kotlin方式,动态注册native函数例子
后面再深入学习
参考:Android JNI(一)——NDK与JNI基础 - 简书
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)