JNI
来源:互联网 发布:头条新闻软件下载 编辑:程序博客网 时间:2024/06/14 05:07
JNI
socket
socket
为标socket
协议, 同Windwos
使用方法.
Linux
的Socket
多了一种使用方法, 因为socket
都是可以映射文件
则可以做无需网络的socket
(跨进程通讯使用socket
,基于文件对象)
使用方法同正常的Socket
生成JNI头文件
- 类中声明
native
方法 - 在源码根目录
javah packetNmae.className
生成JNI头文件
javah 程序
-classpath 目录(一般为当前目录)
-jni 包名.类名
javah -classpath. -jni packetNmae.className
获得方法签名
javap -p -s -classpath . packetName.className
反射调用
调用流程:
参数说明:
env: JAVA虚拟机环境
第一个jobj: 类的this指针
后边跟的参数1 ,2 ….
//通过RTTI, 使用字符串获得RunTimeClass//packetNameStr中的'.'替换为'/'jclass clazz = (*env)->FindClass(env, packetNameStr);//通过方法名,方法签名(传参方式),获得方法IDjmethodID methodID = (*env)->GetMethodID(env, clazz, FunName, FunSig);//调用Void返回值的方法, //虚拟机环境, 类对象, 方法ID, 方法参数1, 方法参数2 ....(*env)->CallVoidMethod(env, obj, methodID, arg1);
SO中注册一个未导出的函数
修改函数的导出属性
//隐藏导出方法__attribute__ ((visibility ("hidden"))) jstring JNICALL MyAdd (JNIEnv *pEnv, jobject obj, jint n1, jint n2)
//隐藏全局字段__attribute__ ((visibility ("hidden"))) JNINativeMethod g_NativeMethod[] = { "MyAdd", "(II)Ljava/lang/String;", (void*)MyAdd};//SO的 JNI 回调, 相比_init 会传入两个参数JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){ LOGD("JNI_OnLoad"); //获取jniEnv环境 JNIEnv *pEnv = NULL; int version = vm->GetEnv((void**)&pEnv, JNI_VERSION_1_4); LOGD("GetEnv:%d", version); if (pEnv == NULL) { LOGD("GetEnv error"); return JNI_VERSION_1_4; } //获取成功 LOGD("JNI_OnLoad GetEnv=%p", pEnv); //获取MainActivity的RunTimeClass jclass clsMainActivity = pEnv->FindClass("cr/jni/MainActivity"); if (IsException(pEnv)) return JNI_VERSION_1_4; //注册本地方法 pEnv->RegisterNatives(clsMainActivity, g_NativeMethod, sizeof(g_NativeMethod) / sizeof(g_NativeMethod[0])); if (IsException(pEnv)) return JNI_VERSION_1_4; return JNI_VERSION_1_4;}
直接在类中声明为
Native
方法,直接可以调用
因为JVM
有保存全局的全部的方法表
结构如下:
typedef struct { const char* name; //方法名 const char* signature; //方法签名(传参方式) void* fnPtr; //方法指针} JNINativeMethod;
0 0
- Jni
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- JNI
- 如何在自定义Listener(监听器)中使用Spring容器管理的bean
- SRM579 Div1Medium TravellingPurchasingMan
- C# File操作类
- CODEVS 1231 最优布线问题
- CSS清除浮动的方法
- JNI
- Vue学习笔记_03
- python函数参数之_可变参数
- 1014. 福尔摩斯的约会 (20)
- 查找--二分查找
- POJ 1753 Flip Game (DFS + 暴力枚举)
- 百度外卖面经( 2016-10-11更新)
- 编译器Sublime的导航栏sidebar的字体怎么调大
- Java api