51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3020|回复: 0
打印 上一主题 下一主题

[原创] 实际项目中C++如何调用java应用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-5-18 01:11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天看阿里巴巴搜索技术中心文档,无意发现:

“camera内部是采用java语言来实现的,本接口把camera的java接口封装成C++接口,通过c语言构建jvm来调用camera的java接口”,

我就很想一看究竟c++如何调用java程序了。



参考http://www.velocityreviews.com/f ... ll-java-from-c.html





D:\lr_script\MyJNI>java -version

java version "1.5.0_06"



DemoMain.java内容如:

import java.io.*;

public class DemoMain {

public static void main(String[] args) throws java.io.IOException, java.lang.NullPointerException

{

System.out.println("This is a test.");

}// end main().

}// end class DemoMain.



采用vc6++ IDE,采用JNI技术实现。

(1)    编译时:

C++  preprocessor->additional include directories:

  加入 D:\Sun\AppServer\jdk\include

(2)运行时,

把 D:\Sun\AppServer\jdk\jre\bin\server\jvm.dll 加入环境变量。



#ifndef __cplusplus

#define __cplusplus

#endif

#include "jni.h"

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

#pragma comment (lib,"D:\\Sun\\AppServer\\jdk\\lib\\jvm.lib")



void main() {



JavaVM *jvm;

JNIEnv *env;



JavaVMInitArgs vm_args;

JavaVMOption options[3];



options[0].optionString = "-Djava.compiler=NONE";

options[1].optionString = "-Djava.classpath=.";

options[2].optionString = "-verbose:jni";



vm_args.version = JNI_VERSION_1_4;

vm_args.nOptions = 3;

vm_args.options = options;

vm_args.ignoreUnrecognized = JNI_TRUE;



jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

if (res < 0) {

fprintf(stderr, "Can't create Java VM\n");

exit(1);

};



jclass cls = env->FindClass("DemoMain");

if (cls == 0) printf("Sorry, I can't find the class");



fprintf(stdout, "This is invokeSimplified4.\n");



jmethodID get_main_id;



if(cls != NULL)

{



get_main_id =env->GetStaticMethodID(cls,"main","([Ljava/lang/String;)V");



fprintf(stdout, "This is invokeSimplified5.\n");



if(get_main_id != NULL )

{

      jclass string = env->FindClass("java/lang/String");

      jobjectArray args = env->NewObjectArray(0,string, NULL);



      fprintf(stdout, "This is invokeSimplified6.\n");

      int i = env->CallIntMethod(cls, get_main_id, args);

      fprintf(stdout, i+ "This is invokeSimplified7.\n");

}

}// end IF.



jvm->DestroyJavaVM();

fprintf(stdout, "Java VM destory\n");

}//end main.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-15 15:30 , Processed in 0.066749 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表