23、jvm之JNI

JNI是Java Native Interface的缩写,JAVA本地调用。从jdk1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。看过JDK源代码的人肯定会注意到在源码里有很多标记成native的方法。这些个方法只有方法签名但是没有方法体。其实这些naive方法就是我们说的 java native interface。他提供了一个调用(invoke)的接口,然后用C或者C++去实现;

 

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

 

GCC:(GNU Compiler Collection,GNU编译器套装)是一套支持多种编程语言的编译器。GCC是大多数类Unix操作系统(如Linux、BSD、Mac OS X等)的标准的编译器,GCC同样适用于微软的Windows。GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。GCC原名为GNU C编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,并支持处理C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go等。

 

GCC编译后缀名:

  .c为后缀的文件,C语言源代码文件; 

  .C,.cc或.cxx 为后缀的文件,是C++源代码文件; 

  .h为后缀的文件,是程序所包含的头文件; 

 

C编译后缀名:

头文件后缀名: .h

源文件后缀名: .c

 

C++编译后缀名:

头文件后缀名: .h,   .hpp,   .hxx

源文件后缀名:.cpp,   .cc,   .cxx,   .C   .c++

 

新建项目JNI

package org.nickfover.jni;
public class Demo1 {
	public native void say(String str);
}

E:\ECLIPSEWORKPALCE\JNI\src>javac org/nickfover/jni/Demo1.java

E:\ECLIPSEWORKPALCE\JNI\src>javah org.nickfover.jni.Demo1

返回src目录:

打开c++开发工具VC 6,新建一个Win32 Dynamic-Link library项目,取名为JAVAJNI;

23、jvm之JNI_第1张图片


23、jvm之JNI_第2张图片

将org_nickfover_jni_Demo1.h文件拷贝到这个工程目录下;将修改为"jni.h"

在项目里新建一个c++source file ,内容如下:

#include   
#include "org_nickfover_jni_Demo1.h"
JNIEXPORT void JNICALL Java_org_nickfover_jni_Demo1_say
  (JNIEnv *, jobject, jstring)
{
    cout << "Hello, " << endl;  
}  

效果图:

23、jvm之JNI_第3张图片
这时编译会报错,将*/java/include下的jni.h和jni_md.h也拷贝到工程目录下:

23、jvm之JNI_第4张图片
现在执行编译build(F7); 在debug目录就会生成一个JAVAJNI.dll文件;现在将这个文件拷贝到java库中;

1、查看java库:

System.out.println( System.getProperty("java.library.path"));
列出了一些java的库,拷贝到其中的一个;比如我拷贝到:D:\ZmyExe\java\bin\JAVAJNI.dll

2.测试:

package org.nickfover.jni;
public class Demo1 {
	static{
		 System.loadLibrary("JAVAJNI");  //加载dll文件
        }
	public native void say(String s);
	public  static  void main(String[] str){
		new Demo1().say("1");
	}
}

输出:

Hello,

调用dll文件成功;

 

也可以直接将JAVAJNI.dll文件放在java工程目录下:

23、jvm之JNI_第5张图片


 传递参数需要了解数据类型在内存中的表示,后跟进

你可能感兴趣的:(java,java,c/c++,嵌入式)