1.调用的流程
2.开发流程
c/c++文件 java与jni互调例子
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
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, "<init>", "()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 %s\n",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基础 - 简书
|