JNI学习--通过Java应用调用C语言的函数打印hello,world

原创 2012年03月29日 19:09:48

本文主要的内容来源于Java Native Interface: Programmer's Guide and Specification中的第二章的内容,最后附加遇到的问题的解决方案。可通过http://java.sun.com/docs/books/jni/下载该书。

开发环境:

Win7+VS2010+JDK1.6.0_27

Linux下如何使用可参考http://my.unix-center.net/~Simon_fu/?p=359

1、声明本地方法 Declare the Native Method

新建文件HelloWorld.java,输入以下内容

 class HelloWorld {
     private native void print();
     public static void main(String[] args) {
         new HelloWorld().print();
     }
     static {
         System.loadLibrary("HelloWorld");
     }
 }
2、编译为class文件

javac HelloWorld.java
如果说找不到javac,说明没有添加环境变量,加入java的环境变量

3、生成本地方法的头文件 Create the Native Method Header File

javah -jni HelloWorld
当前目录下会生成.h的头文件

4、实现本地方法 Write the Native Method Implementation

新建HelloWorld.c文件,编写如下内容

 #include <jni.h>
 #include <stdio.h>
 #include "HelloWorld.h"
 
 JNIEXPORT void JNICALL 
 Java_HelloWorld_print(JNIEnv *env, jobject obj)
 {
     printf("Hello World!\n");
     return;
 }
5、编译C的源码,生成本地库 Compile the C Source and Create a Native Library

cl -Ic:\java\include -Ic:\java\include\win32 -MD -LD HelloWorld.c -FeHelloWorld.dll
为了使上述命令成功执行,需要做两件事情

1)找到JDK的安装目录,我的在C:\Program Files\Java\jdk1.6.0_27,里面有一个include文件夹,把该文件夹拷贝到C盘下面的java文件夹(新建一个)下。

为什么要拷贝?因为我的JDK路径中有Program Files,存在空格,如果可以避免空格的话,也就不用拷贝了

当然,上述命令中出现的c:\java\include和include文件夹所在的路径相匹配,所以也没必要一定放在C盘的下面

2)cl命令在命令行下面执行,会提示

'cl' 不是内部或外部命令,也不是可运行的程序或批处理文件。

最初的想法是配置环境变量,C:\Program Files\Microsoft Visual Studio 10.0\VC\bin加入环境变量,之后,出现如下问题

无法启动此程序,因为计算机中丢失mspdb100.dll。尝试重新安装该程序以解决此问题。

在网上搜索后得知原因为

由于cl.exe依赖VS的环境配置,如果只是以WINDOWS控制台方式进入命令窗口,VS2010相关的环境变量不会被加载,这种情况下在启动CL时就会报以上错误。

需要运行VS2010自带的控制台,可通过如下方式打开

开始-->所有程序-->Microsoft Visual Studio 2010-->Visual Studio Tools-->Visual Studio 命令提示(2010)

6、运行程序

java HelloWorld
可以看到

Hello World!

学习JNI--Android下使用JNI调用C

JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java...
  • cyp331203
  • cyp331203
  • 2014年10月23日 17:28
  • 1506

Java 调用C语言JNI库(Hello World实例)

要在java中调用c语言的库,一直觉得很不可思议,但是Java提供了JNI这个东西,这也就变得可能了. 作为一个码农,我们还是从最简单的 Hello World开始吧. 首先说一下我们想要做的事情....
  • weiqubo
  • weiqubo
  • 2015年08月31日 17:47
  • 4095

学习Golang语言(1): Hello World

今天开始进入golang语言的学习,golang语言的安装和测试就不再这里讲解了。网络上有不少资料可以参考。 学习任何编程语言的第一个程序都是Hello world,我就不打破这个传...
  • codemanship
  • codemanship
  • 2014年06月08日 23:04
  • 11273

编写第一个C语言程序-Hello World

前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法。学习任何一门语言,首先要掌握的肯定是语法。学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算机、手...
  • wolf09311
  • wolf09311
  • 2014年11月16日 22:57
  • 48136

c语言实现一个helloworld

开发工具:Dev-C++ 代码如下: #include   #include main(){ printf("hello world\n"); system("pause");//...
  • shb2058
  • shb2058
  • 2016年10月26日 15:49
  • 530

Hello World!的编译过程(C语言)

几乎所有学C语言编程的同学第一个接触的程序都是Hello World!。但是它是怎么由c文件转换为可执行文件的呢? 源文件(helloworld.c)如下:#include int main() {...
  • LuckySou
  • LuckySou
  • 2016年12月26日 20:58
  • 571

JAVA通过JNI调用C++函数详解

看到一篇讲述JNI调用C++代码的文章,写的非常详细,转载了。转载自:http://www.ibm.com/developerworks/cn/java/jnimthds/,感谢作者的辛勤付出。 ...
  • mfcing
  • mfcing
  • 2015年02月25日 18:12
  • 3419

java jni 入门1 - 一个简单的从Java程序中调用C函数

参考:《JAVA核心技术 卷II:高级特性》第12章 本地方法 ######################################################3 使用本地代码...
  • u012005313
  • u012005313
  • 2015年11月08日 15:46
  • 4601

Java通过JNI调用C的一个小DEMO

最近看java源代码,发现很多方法用native修饰,那么什么事native方法呢?     简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Met...
  • cl05300629
  • cl05300629
  • 2014年09月04日 12:47
  • 5969

6个变态的C语言Hello World程序 之 雷人的程序语言

下面的六个程序片段主要完成这些事情: 输出Hello, World混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。 hello1...
  • Kaitiren
  • Kaitiren
  • 2014年08月05日 18:42
  • 2286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNI学习--通过Java应用调用C语言的函数打印hello,world
举报原因:
原因补充:

(最多只允许输入30个字)