最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人可以得到解决。

在C/C++中调用Java的方法一般分为五个步骤:初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法和退出虚拟机。

下面写一个小程序测试一下:

Java代码:

package jni.test;

public class Demo {

public static int COUNT = 8;

public String msg;

private int[] counts;

public Demo() {

this("缺省构造函数");

}

public Demo(String msg) {

System.out.println(":" + msg);

this.msg = msg;

this.counts = null;

}

public String getMessage() {

return msg;

}

public int[] getCounts() {

return counts;

}

public void setCounts(int[] counts) {

this.counts = counts;

}

public void throwExcp() throws IllegalAccessException {

throw new IllegalAccessException("exception occur.");

}

}

上面的代码很好理解,我相信你能看的懂,我就不说了。

下面是C语言代码,里面有注释,这里先不详细说明,主要先跑起来再说:

#include#include#include#includeintmain() {//定义用到的变量intres;

JavaVM*jvm;

JNIEnv*env;

JavaVMInitArgs vm_args;

JavaVMOption options[3];

vm_args.version;//设置初始化参数options[0].optionString="-Djava.compiler=NONE";//classpath有多个时,用";"分隔,UNIX下以":"分割。options[1].optionString="-Djava.class.path=.";//用于跟踪运行时的信息options[2].optionString="-verbose:jni";//版本号设置不能漏vm_args.version=JNI_VERSION_1_6;

vm_args.nOptions=3;

vm_args.options=options;

vm_args.ignoreUnrecognized=JNI_TRUE;//1.初始化虚拟机res=JNI_CreateJavaVM(&jvm, (void**)&env,&vm_args);if(res<0)

{

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

exit(1);

}//2.获取类jclass cls=env->FindClass("jni/test/Demo");//3.获取类的方法jmethodID mid=env->GetMethodID(cls,"getMessage","()Ljava/lang/String;");//获取Java的构造方法jmethodID con=env->GetMethodID(cls,"","(Ljava/lang/String;)V");

jstring strinit=env->NewStringUTF("Still is coding!");

jvalue arg[1];

arg[0].l=strinit;//env->AllocObject(cls);//4.创建类的对象jobject obj=env->NewObjectA(cls,con,arg);//调用对象的方法jstring msg=(jstring)env->CallObjectMethod(obj, mid);

cout<GetStringUTFChars(msg,JNI_FALSE);

printf("%s===",str);//5.退出虚拟机jvm->DestroyJavaVM();

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

}

把以上C语言代码用VC6.0打开,然后编译,下面问题就来了,我们一个一个解决。

编译的时候首先会出现如下问题:

错误很明显,我们上面包含了jni.h,但是没找到。这是需要设置一下VC。

Tools->Options->Directories,添加JDK安装目录下的两个目录,如图:

同时在Library files中添加JDK下面的LIB目录,如下图:

点击OK完成,重新编译。

好,新问题又来了,看下面描述:

也很明显,说明没有找到jvm.lib。继续设置VC,Project->Settings->Link->Object/library modules中把上述路径替换为本机实际安装JDK中的jvm.lib目录,添加完后如下图:

点击OK后重新编译,呵呵,又来问题了,我很高兴啊。

这个问题在网上查了一下,原来是我JDK安装在Program Files下的问题,因为Program Files路径中有一个空格,真郁闷,没办法,只好重装JDK,注意安装目录中不能再有空格了。安装完了,按照上面出现的问题再重新设置一下VC,然后编译,没问题,运行,哇靠,又是一个问题:

这个问题可是花了我大半天时间才搞定的,但其实做法很简单。

看错描述,是没找到jvm.dll,网上很多人说直接找到这个文件把它拷贝到当前目录。但是这种方法不可取,因为jvm.dll这个东东还会依赖其他的文件的,而且它找其它所依赖的文件是通过相对路径找的,你直接就搞这么一个文件出来,其它的也找不到啊。所以这里有一个很好的解决方案,就是把D:\Java\jdk1.6.0_23\jre\bin\client这个JDK下的路径加入Path环境变量,加完之后记得重新用VC打开CPP文件,这个很重要,否则,这个问题还是没有解决。

点击编译,运行,如果出现如下画面,OK,恭喜你,C语言调用Java成功了,下面要做的就是去看代码,并且了解运行的机理了,这个我就不多说了。

原帖:http://blog.csdn.net/sunchaoenter/article/details/6598719

c如何调用java_JNI学习------C语言调用Java (转)相关推荐

  1. html5d调用百度语音,易语言调用百度语音平台实现文字转换语音功能的代码

    调用百度语音平台实现文字转换语音功能 此功能需要加载精易模块5.6 .版本 2 .支持库 wmp9 .程序集 窗口程序集1 .子程序 _试听按钮_被单击 播放器1.地址 = "http:// ...

  2. c语言调用python3_linux下c语言调用python方法问题

    //c语言多线程调python,必须加上红色字体,因为python本身不是线程安全的 PyObject* callPython(char* cpModelPath) { if(cpModelPath ...

  3. java调用webservice_WebService学习总结(四)——调用第三方提供的webService服务

    只为成功找方法,不为失败找借口! 互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气 ...

  4. java调用go接口_go语言调用API实线分词

    1.确保已经安装go语言 2.代码实现 B.代码: package pullword import ( "bufio" "fmt" "net" ...

  5. 电脑语言java,零基础学习电脑语言;Java学习路线!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 万事开头难,即使你年纪大了些,但是只要你想学:那就能学好! 自学编程建议从C语言学起,可以说60%~80%的程序员都是从C语言开始的. 编程语言分为结构化 ...

  6. c语言调用oracle函数返回值吗,C语言通过值和引用函数

    . 将参数值或数据传递给C语言函数有两种方法:通过值调用和通过引用调用.原始值在通过值调用时不修改,但通过引用调用时,在函数中可进行修改. 下面将分别讲解如何通过值调用和通过引用调用,并用使用示例逐个 ...

  7. c语言调用自己编译的头文件,写自己的头文件 ——C语言的多文件编译

    每个学习C语言的人 肯定都知道程序的第一行要写上一个 #include 包含一个头文件 如果你有兴趣 可以去你的编译器的安装目录下找到这个文件 看看这个文件里有什么内容 这里也有一个gcc 的stdi ...

  8. Java jni 底层_JAVA语言语言调用底层语言的技术JNI解析

    本文主要向大家介绍了JAVA语言语言调用底层语言的技术JNI解析,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. java语言调用底层语言的技术JNI解析. Java代码执行步骤 JN ...

  9. python api调用 验证码_Python语言调用创蓝253短信验证码API文档

    本文主要向大家介绍了Python语言调用创蓝253短信验证码API文档,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. #!/usr/local/bin/python #-*- c ...

最新文章

  1. python3.8.5是python3吗_Python 升级到3.8.5
  2. java设计模式之装饰器模式
  3. tensorflow l2_loss函数
  4. [CODEVS 1301] 任务分配
  5. Error when loading the SDK:发现了含有元素 'd:skin' 开头的无效内容
  6. 一份干货满满的PPT,答辩加分手到擒来!
  7. 【Python】获取星期字符串
  8. C#多线程之Thread
  9. 百度编辑器在服务器置顶路径 解决上传图片创建目录失败的方法(Thinkphp)
  10. Tomcat 服务器—安装、配置、启动、停止
  11. Ansys Speos | 手把手教你画光导
  12. 文章目录---收藏不迷路
  13. css实现气泡框效果
  14. 什么是SVC?AVC和SVC有什么区别
  15. subject 获取登录用户信息
  16. python file是什么意思_Python一直提示runfile是什么意思?
  17. [组合数学] NC13611树 (逆元的计算)
  18. matlab 二次函数图像
  19. 电子计算机二级的模拟试题,计算机二级模拟试题
  20. jsf java_JSF学习实战

热门文章

  1. 视频移动侦测VMD的实现
  2. Protobuf生成Go代码指南
  3. Redis:Big Key问题
  4. 2019年创业融资去哪个平台好?创成汇
  5. android客户端从服务器端获取json数据并解析的实现代码
  6. 使用SQL Server 2005作业设置定时任务
  7. 【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件
  8. 查看java的dump日志并进行分析
  9. cctv系统车站服务器功能,CCTV系统
  10. idea中使用逆向工程----三部曲