文档章节

Win64下通过JNI(C++)创建jvm

ihaolin
 ihaolin
发布于 2013/12/09 00:49
字数 424
阅读 1076
收藏 19

在Win64下通过jni启动jvm并运行java类:

  • 环境设置:

       jdk: jdk7_45(x64)

       vs2010 64位命令行工具, 用来编译我们写的C++,就是这个:

       

      环境变量设置:

  • LIB变量添加“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64”, 编译时能找到64位库;
  • LIB变量中添加%JAVA_HOME%\lib,主要是在编译时能找到jvm.lib库文件;
  • PATH变量中添加%JAVA_HOME%\jre\bin\server,主要是为了运行编译后的exe文件能找到jvm.dll文件.
  • 码代码:

       java代码(待执行):

public class HelloInvocation{
	public static int add(int a, int b) {
		return a+b;
	}
}
      c++代码:
#include <jni.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN32
	#define PATH_SEPARATOR ';'
#else
	#define PATH_SEPARATOR ':'
#endif

int main(){
	JavaVMOption options[1];
	JNIEnv *env;
	JavaVM *jvm;
	JavaVMInitArgs vm_args;
	long status;
	jclass cls;
	jmethodID mid;
	jint result;
	
	options[0].optionString = "-Djava.class.path=.";
	memset(&vm_args, 0, sizeof(vm_args));
	vm_args.version = JNI_VERSION_1_6;
	vm_args.nOptions = 1;
	vm_args.options = options;
	status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

	if (status != JNI_ERR){
		cls = env->FindClass("HelloInvocation");
		if (cls != 0){
			mid = env->GetStaticMethodID(cls, "add", "(II)I");
			if (mid != 0){
				result = env->CallStaticIntMethod(cls, mid, 4, 7);
				printf("Hi, 4 + 7 = %d\n", result);
			}
		}
		jvm->DestroyJavaVM();
		return 0;
	} else{
		return -1;
	}
}
作为一个看到这里的程序员,你应该很容易理解上面的代码,我不多说;
  • 拿出你的Vs2010命令行工具, 编译吧, 运行吧(编译要加入我们java jvm的库文件依赖哈):

  • 执行:

      

  • 还有些小事情,其实这里我们是借助vs2010命令行工具运行的exe文件,要是直接双击exe文件时运行不了的,应该是没有vs2010命令行工具的环境,等我后面再研究下,怎么自己来设置这些上下文,或者你知道,也可以告诉me,最后的效果图:
  • 收工




© 著作权归作者所有

共有 人打赏支持
ihaolin
粉丝 259
博文 164
码字总数 106524
作品 4
朝阳
高级程序员
私信 提问
cocos2d-x中通过Jni实现Java与C++的互相调用

cocos2d-x中通过Jni实现Java与C++的互相调用。 cocos2d-x用开发者提供了一个类JniHelper,提供了java与c++之间互调的jni解决方案。 笔者所开发的“史上最坑爹的游戏”项目中使用到了JNI,为此...

MingliC
2013/12/23
0
2
Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0
JNI和NDK的区别

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native...

长平狐
2013/01/06
62
0
C++与java混合编写和C++与OC混合编写 笔记

1、Java与C++混合编写: 使用JNI(Java本地调用) 实例:cocos2dx/platform/android/jni对应目录cocos2dx/platform/android/java const char getConstStrRetuen(const char funcName){ JniMeth......

悠米海
2014/06/12
0
0
android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言C/C++去实现对时...

刘小米
2014/09/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

  这篇博文本来是想放在全系列的大概第五、六篇的时候再讲的,毕竟查询是在索引创建、索引文档数据生成和一些基本概念介绍完之后才需要的。当前面的一些知识概念全都讲解完之后再讲解查询是...

SEOwhywhy
4分钟前
0
0
以太坊PHP离线交易开发包

EthTool开发包适用于希望采用裸交易的PHP以太坊应用开发,主要包含以下特性: 支持裸交易部署/调用合约 内置etherscan和infura支持 keystore生成与读取,兼容geth/parity 采用裸交易的一个好...

笔阁
31分钟前
1
0
SRE的含义及与 DevOps 如何关联?

虽然站点可靠性工程师(site reliability engineer SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题...

linuxCool
32分钟前
1
0
月入3万之一个程序员的转行坎坷历程

陈年往事 “我月入3万,怎么会少少了你一个鸡蛋啊?” 这是2017年9月左右的一个新闻,一位煎饼摊大妈因和顾客争执时脱口而出这样一句话而走红。当时还上了各大新闻的头条。 互联网兴起今天,...

苏南-首席填坑官
54分钟前
3
1
OSChina 周一乱弹 —— 眼看着这颗陨石砸了下来

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Nachtblut的单曲《Antik》 《Antik》- Nachtblut 手机党少年们想听歌,请使劲儿戳(这里) @mr_chip :上海的初雪之后有点冷 ...

小小编辑
今天
528
9

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部