Java JNI简单实现
Java类型
|
本地类型
|
描述
|
boolean
|
jboolean
|
C/C++8位整型
|
byte
|
jbyte
|
C/C++带符号的8位整型
|
char
|
jchar
|
C/C++无符号的16位整型
|
short
|
jshort
|
C/C++带符号的16位整型
|
int
|
jint
|
C/C++带符号的32位整型
|
long
|
jlong
|
C/C++带符号的64位整型
|
float
|
jfloat
|
C/C++32位浮点型
|
double
|
jdouble
|
C/C++64位浮点型
|
Object
|
jobject
|
任何Java对象,或者没有对应java类型的对象
|
Class
|
jclass
|
Class对象
|
String
|
jstring
|
字符串对象
|
Object[]
|
jobjectArray
|
任何对象的数组
|
boolean[]
|
jbooleanArray
|
布尔型数组
|
byte[]
|
jbyteArray
|
比特型数组
|
char[]
|
jcharArray
|
字符型数组
|
short[]
|
jshortArray
|
短整型数组
|
int[]
|
jintArray
|
整型数组
|
long[]
|
jlongArray
|
长整型数组
|
float[]
|
jfloatArray
|
浮点型数组
|
double[]
|
jdoubleArray
|
双浮点型数组
|
- #ifndef HELLOJNI_H_
- #define HELLOJNI_H_
- #include <jni.h>
- // JNI调用函数必须要用C编译器编译
- // C++不加extern "C",调用会有异常
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * 1、JNIEXPORT、JNICALL:jni的宏
- * 2、jstring:返回值类型(对应java的string)
- * 3、C方法名:Java_pacakege_class_method
- * 4、JNIEnv*、jobject:jni必要参数(jni环境、java对象)
- */
- JNIEXPORT void JNICALL Java_org_join_jni_JniTest_sayHelloWin (JNIEnv*, jobject, int, int, int, int);
- #ifdef __cplusplus
- }
- #endif
- #endif /* HELLOJNI_H_ */
返回jstring:return (*env)->NewStringUTF(env, "XXX");
- /** C回调Java方法(静态) */
- public static int add(int x, int y) {
- System.out.println("==Java静态add方法==");
- return x + y;
- }
- /** C回调Java方法(非静态) */
- public int sub(int x, int y) {
- System.out.println("==Java非静态sub方法==");
- return x - y;
- }
- #ifndef CALLJAVA_H_
- #define CALLJAVA_H_
- #include <jni.h>
- #include <stdio.h>
- #include <stdlib.h>
- int add(JNIEnv*, int, int);
- int sub(JNIEnv*, int, int);
- jobject getInstance(JNIEnv*, jclass);
- #endif /* CALLJAVA_H_ */
- #include "CallJava.h"
- /**
- * C回调Java方法(静态)
- */
- int add(JNIEnv *env, int x, int y) {
- // 获取类
- jclass AnalyzeCidUtil = env->FindClass("org/join/jni/JniTest");
- if (NULL == AnalyzeCidUtil) {
- return -1;
- }
- // 获取类add静态方法
- /*
- * 第三个参数为方法签名
- *
- * 可用JDK自带工具javap生成该类所有方法签名
- * 控制台进入该类class文件目录,输入:javap -s -private 类名
- */
- jmethodID add = env->GetStaticMethodID(AnalyzeCidUtil, "add", "(II)I");
- if (NULL == sub) {
- env->DeleteLocalRef(AnalyzeCidUtil); // 删除类指引
- return -2;
- }
- // 调用静态int方法
- int result = env->CallStaticIntMethod(AnalyzeCidUtil, add, x, y);
- // 返回结果
- return result;
- }
- /**
- * C回调Java方法(非静态)
- */
- int sub(JNIEnv *env, int x, int y) {
- // 获取类
- jclass AnalyzeCidUtil = env->FindClass("org/join/jni/JniTest");
- if (NULL == AnalyzeCidUtil) {
- return -1;
- }
- // 实例化类对象
- jobject mAnalyzeCidUtil = getInstance(env, AnalyzeCidUtil);
- if (NULL == mAnalyzeCidUtil) {
- env->DeleteLocalRef(AnalyzeCidUtil); // 删除类指引
- return -2;
- }
- // 获取对象sub方法
- jmethodID sub = env->GetMethodID(AnalyzeCidUtil, "sub", "(II)I");
- if (NULL == sub) {
- env->DeleteLocalRef(AnalyzeCidUtil); // 删除类指引
- env->DeleteLocalRef(mAnalyzeCidUtil); // 删除类对象指引
- return -3;
- }
- // 调用非静态int方法
- int result = env->CallIntMethod(mAnalyzeCidUtil, sub, x, y);
- // 返回结果
- return result;
- }
- /**
- * 实例化类对象
- */
- jobject getInstance(JNIEnv *env, jclass clazz) {
- // 获取构造方法
- jmethodID constructor = env->GetMethodID(clazz, "<init>", "()V");
- if (NULL == constructor) {
- return NULL;
- }
- // 实例化类对象
- return env->NewObject(clazz, constructor);
- }
总之不行或者非win32系统的话重新编译吧,源文件在JniDll_win32工程内都有。注意include Java安装目录下include文件夹内的头文件哦。VS2010的话,右键工程 -> Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories内设置,如:%JAVA_HOME%\include;%JAVA_HOME%\include\win32。
附件:http://down.51cto.com/data/2359729
本文转自winorlose2000 51CTO博客,原文链接:http://blog.51cto.com/vaero/770139,如需转载请自行联系原作者
Java JNI简单实现相关推荐
- java jni调用dll文件_Java通过jni调用动态链接库
(1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...
- Android JNI简单实例(android 调用C/C++代码)
转载自 xiechengfa 最终编辑 xiechengfa Android JNI简单实例关键字: android.jni Android的jni实例 android 的应用程序(Dalvik VM ...
- Java jni 底层_Java中的native是如何实现的(JNI)
什么是JNI JNI是Java Native Interface的缩写,Java本地接口(JNI)提供了将Java与C/C++.汇编等本地代码集成的方案,该规范使得在 Java 虚拟机内运行的 Jav ...
- java jni开发_Java JNI开发实践记录
当使用到JNI的时候,基本可以肯定Java的平台移植性注定减弱,接下来记录一次使用Java JNI开发的经历. 关于Java JNI的相关资料参见: 下面是使用JNI常见三种场景: 1.在Java应用 ...
- Java JNI初体验
Java JNI初体验 JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植. 从Java1.1开始,JNI标准成为java ...
- java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...
- java实现简单窗体小游戏----球球大作战
java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: 坐标.大小.颜色.方向.速度 2.抽象类:Ball 设计类:BallMain-创建窗体 BallJPanel- ...
- java实现账号单一ip登录,使用Java实现简单后台访问并获取IP示例
使用Java实现简单后台访问并获取IP示例 发布时间:2020-10-28 21:57:57 来源:亿速云 阅读:92 作者:Leah 使用Java实现简单后台访问并获取IP示例?针对这个问题,这篇文 ...
- 用limit 实现java的简单分页
https://blog.csdn.net/xinyuezitang/article/details/84324359 用limit 实现java的简单分页 xinyuezitang 2018-11- ...
最新文章
- ICinsights:中国芯片难达成既定的2025目标
- android 封装状态页面,Android 缺省页状态切换方案
- Session分布式共享 = Session + Redis + Nginx
- 3.7 为什么需要非线性激活函数-深度学习-Stanford吴恩达教授
- P7011-[CERC2013]Escape【堆,启发式合并】
- java栅格法全局路径规划,基于A*的全局路径规划算法(1)
- 安卓应用安全指南 5.6.2 密码学 规则书
- Google TakeOut图片下载器
- 1000道Python题库系列分享22(40个填空题)
- 为了运行内存多两G,多花几百块值不值?
- 【基础】算法时空复杂度【OI缩水版】
- 大学C语言各章节练习题_及答案合集【350题】《选择题- 判断-程序填空-程序设计》
- 统计Java源代码中关键字的数目(每个关键字的数目)
- C语言中的斐波那契数列程序
- 智鼎逻辑推理题及答案_2019最新玛氏笔试真题节选(含答案及解析)
- 影视剪辑,零基础如何自学入门剪辑,视频剪辑入门规划
- 替换WIN键和Ctrl键
- 超过2t硬盘分区_大于2T的硬盘怎么分区
- “瘾品”经济正当道,低度酒成为新财富密码?
- 测试进阶篇之测试用例设计-百度云盘