当前位置:   article > 正文

Windows 下JNI开发流程(visual studio + eclipse)_windows编写jni

windows编写jni

    转载请注明出处:

 

       JNI全称是Java Native Interface(Java本地接口)单词首字母的缩写,本地接口就是指用C和C++开发的接口。由于JNI是JVM规范中的一部份,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码。

 

       开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编译过程当中要依赖当前操作系统环境所提供的一些库函数,并和本地库链接在一起。而且编译后生成的二进制代码只能在本地操作系统环境下运行,因为不同的操作系统环境,有自己的本地库和CPU指令集,而且各个平台对标准C/C++的规范和标准库函数实现方式也有所区别。这就造成使用了JNI接口的JAVA程序,不再像以前那样自由的跨平台。如果要实现跨平台,就必须将本地代码在不同的操作系统平台下编译出相应的动态库。

 

JNI开发流程主要分为以下4步:

1、在eclipse中编写声明了native方法的Java类

2、生成JNI头文件

3、在visual studio 中创建DLL 项目,实现 JNI头文件中的方法

4、在eclipse中设置Native library location,路径为 visual studio 中生成的DLL 文件路径,运行java 程序

 

 

通过上面的介绍,相信大家对JNI及开发流程有了一个整体的认识,下面通过一个HelloWorld的示例,再深入了解JNI开发的各个环节及注意事项。

第一步、在eclipse中新建一个HelloWorld.java

  1. package com.study.jnilearn;  
  2.   
  3. public class HelloWorld {  
  4.       
  5.     public static native String sayHello(String name);  // 1.声明这是一个native函数,由本地代码实现  
  6.   
  7.     public static void main(String[] args) {  
  8.         String text = sayHello("yangxin");  // 3.调用本地函数  
  9.         System.out.println(text);  
  10.     }  
  11.       
  12.     static {  
  13.         System.loadLibrary("HelloWorld");   // 2.加载实现了native函数的动态库,只需要写动态库的名字  
  14.     }  
  15.   
  16. }  

 

第二步、生成JNI头文件

1.配置 javah External tools
   
 

如图点击第二项 External tools Configurations


2.配置  如图 


 



Working directory:       ${project_loc}/src 
Arguments:                  -classpath ${project_loc}/bin/ -d ${project_loc}/jni -jni ${java_type_name} 

 

3. 执行jExternal tools( javah)生成JNI 头文件

第三步、用本地代码实现.h头文件中的函数

将第二步中生成的头文件copy 过来

 

com_study_jnilearn_HelloWorld.h:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_study_jnilearn_HelloWorld */  
  4.   
  5. #ifndef _Included_com_study_jnilearn_HelloWorld  
  6. #define _Included_com_study_jnilearn_HelloWorld  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_study_jnilearn_HelloWorld 
  12.  * Method:    sayHello 
  13.  * Signature: (Ljava/lang/String;)Ljava/lang/String; 
  14.  */  
  15. JNIEXPORT jstring JNICALL Java_com_study_jnilearn_HelloWorld_sayHello  
  16.   (JNIEnv *, jclass, jstring);  
  17.   
  18. #ifdef __cplusplus  
  19. }  
  20. #endif  
  21. #endif  

 

HelloWorld.c:

  1. // HelloWorld.c  
  2.   
  3. #include "com_study_jnilearn_HelloWorld.h"  
  4.   
  5. #ifdef __cplusplus  
  6. extern "C"  
  7. {  
  8. #endif  
  9.   
  10. /* 
  11.  * Class:     com_study_jnilearn_HelloWorld 
  12.  * Method:    sayHello 
  13.  * Signature: (Ljava/lang/String;)Ljava/lang/String; 
  14.  */  
  15. JNIEXPORT jstring JNICALL Java_com_study_jnilearn_HelloWorld_sayHello(  
  16.         JNIEnv *env, jclass cls, jstring j_str)  
  17. {  
  18.     const char *c_str = NULL;  
  19.     char buff[128] = { 0 };  
  20.     c_str = (*env)->GetStringUTFChars(env, j_str, NULL);  
  21.     if (c_str == NULL)  
  22.     {  
  23.         printf("out of memory.\n");  
  24.         return NULL;  
  25.     }  
  26.     (*env)->ReleaseStringUTFChars(env, j_str, c_str);  
  27.     printf("Java Str:%s\n", c_str);  
  28.     sprintf(buff, "hello %s", c_str);  
  29.     return (*env)->NewStringUTF(env, buff);  
  30. }  
  31.   
  32. #ifdef __cplusplus  
  33. }  
  34. #endif  

第六步、运行Java程序

       Java在调用native(本地)方法之前,需要先加载动态库。如果在未加载动态之前就调用native方法,会抛出找不到动态链接库文件的异常。如下所示:

  1. Exception in thread "main" java.lang.UnsatisfiedLinkError: com.study.jnilearn.HelloWorld.sayHello(Ljava/lang/String;)Ljava/lang/String;  
  2.     at com.study.jnilearn.HelloWorld.sayHello(Native Method)  
  3.     at com.study.jnilearn.HelloWorld.main(HelloWorld.java:9)  

设置Native library location

通过ALT + ENTER 调出properties 选项卡

 

费了那么大劲,终于可以运行写好的Java程序了,结果如下:

  1. Java Str:yangxin  
  2. hello yangxin  

 

注意事项:

    java 程序的版本和 dll 程序的版本要对上,例如x64的Java程序 需要编写 x64的dll 动态库

参考: http://blog.csdn.net/xyang81/article/details/41777471

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/119559?site
推荐阅读
相关标签
  

闽ICP备14008679号