最近看了Java 调用C 和 C/C++反调Java,感叹当年的大牛为什么要这么弄
来源:互联网 发布:万科建筑设计优化微盘 编辑:程序博客网 时间:2024/05/08 08:40
于是自己模仿他的设计也写了个小程序,晒晒,关键就是C++包裹了一个类 struct JNIEnv_ ,内部又通过组合的方式加入了const struct JNINativeInterface_ 的指针
佩服啊,还有那个this 我靠,要是我写我肯定想不到这么写, 我肯定这么写,当然我这么写必然看上去很垃圾。
return functions->GetVersion(&funcions)
但是这么写多不好看 由于类型的关系
我们不能这么写return functions->GetVersion(funcions) 而非得加个'&',可是大牛们一个this
return functions->GetVersion(this)
多简洁,又看不出破绽,佩服佩服。
#include <stdio.h>#include <stdlib.h>struct JNINativeInterface_;struct JNIEnv_;#ifdef __cplusplustypedef JNIEnv_ JNIEnv;#elsetypedef const struct JNINativeInterface_ *JNIEnv;#endifstruct JNINativeInterface_ { int version; int (*GetVersion)(JNIEnv *env);};struct JNIEnv_ { const struct JNINativeInterface_ *functions;#ifdef __cplusplus int GetVersion() { return functions->GetVersion(this); }#endif};int GetVersion(JNIEnv *env){#ifdef __cplusplus //JVM中代码不走这段,为运行方便而加 return env->functions->version;#else return (*env)->version;#endif}struct JNINativeInterface_ g_env = {100, GetVersion};void JNI_CreateJavaVM(void **penv){#ifdef __cplusplus//同上 JVM中不会走这个 (*(JNIEnv **)penv) = new JNIEnv; (*(JNIEnv **)penv)->functions = &g_env;#else static JNIEnv ge = &g_env; *(JNIEnv **)penv = ≥#endif}void JNI_DestroyJavaVM(void **penv){#ifdef __cplusplus//同上 JVM不会走这个 delete (*(JNIEnv **)penv);#else#endif *(JNIEnv **)penv = NULL;}int main(int argc, char **argv){ JNIEnv *env; JNI_CreateJavaVM((void **)&env);#ifdef __cplusplus int v = env->GetVersion();#else int v = (*env)->GetVersion(env);#endif printf("version=%d\n", v); JNI_DestroyJavaVM((void **)&env); return 0;}
- 最近看了Java 调用C 和 C/C++反调Java,感叹当年的大牛为什么要这么弄
- C++、java和matlab最近使用的一些比较
- java和c+的webservice互调用
- java 调用C的API
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- 关于 android 的JNI的java 调用 C和 C 调用JAVA(1)
- 关于 android 的JNI的java 调用 C和 C 调用JAVA(2)
- 为什么Java不需要sizeof()(和C/C++的比较)
- 有关c语言考试的感叹
- java调用C语言
- java调用c
- 实现java调用c
- Java调用C/C++
- C调用JAVA
- C/C++调用Java
- java调用C
- java调用c、c++
- ASP.NET 下MVC设计模式的实现方式
- 云计算问题集锦
- Java 状态模式
- 博客
- Hessian
- 最近看了Java 调用C 和 C/C++反调Java,感叹当年的大牛为什么要这么弄
- Android中的显示单位
- PHP for windows VC9 VC6区别
- 为STL库增加类似 std::ptr_func_ref 功能
- apk反编译
- 统计在线人数
- LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
- 汇编写的一段音乐——两只老虎
- 生成模型和判别模型