• java调用c语言编写的方法---本地方法篇之java中的native关键字


    native关键字

    native是一个计算机函数,它修饰的方法就是一个非java代码的接口,方法的具体实现并不是java,而是由其他语言(比如c或者c++)。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

    JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码

    关于native更多了解,可以去百度。下面我将在windows平台演示一个java调用本地方法的例子,为什么要说平台呢,因为不同平台的动态链接库的文件不一样,比如说windows是后缀为“.dll”的文件,而linux平台是“lib****.so”...

    本例环境:

    windows7 64位

    jdk 32位

    Microsoft Visual C++环境

    1.创建MyNative java类

     1 public class MyNative
     2 {
     3   public void showParms( String s, int i, boolean b )
     4   {
     5     showParms0( s, i , b );
     6   }
     7   private native void showParms0( String s, int i, boolean b );//定义本地方法
     8   static
     9   {
    10     System.loadLibrary( "MyNative" );//静态加载MyNative.dll
    11   }
    12   public static void main( String[] args )
    13 {
    14   MyNative obj = new MyNative();
    15   obj.showParms( "Hello", 23, true );//测试本地方法
    16   obj.showParms( "World", 34, false );
    17 }
    18 }

    2.编译类

    3.生成.h头文件

    会生成MyNative.h文件,内容如下:

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

    第一个参数是调用 JNI 方法时使用的 JNI Environment 指针。第二个参数是指向在此 Java 代码中实例化的 Java 对象 MyNative 的一个句柄。其他参数是方法本身的参数。请注意,MyNative.h 包括头文件 jni.h。jni.h 包含 JNI API 和变量类型(包括jobject、jstring、jint、jboolean,等等)的原型和其他声明。

    4.编写c语言类文件MyNative.c

     1 #include <stdio.h>
     2 #include "MyNative.h"
     3 JNIEXPORT void JNICALL Java_MyNative_showParms0
     4   (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b)
     5 {
     6   const char* szStr = (*env)->GetStringUTFChars( env, s, 0 );
     7   printf( "String = [%s]
    ", szStr );//打印参数s
     8   printf( "int = %d
    ", i );
     9   printf( "boolean = %s
    ", (b==JNI_TRUE ? "true" : "false") );
    10   (*env)->ReleaseStringUTFChars( env, s, szStr );
    11 }

    5.生成.dll文件(这里用到cl命令,所以需要Microsoft Visual C++环境)

    说明:这里的d:/java是我的jdk的位置,MyNative.c是要编译的文件,MyNtive.dll是生成的dll文件名。

    注意:注意保持jvm的位数和Microsoft Visual C++生成的dll文件位数一致,否则会抛出异常:

    Can't load IA 64-bit .dll on a AMD 64-bit ..

     6.执行编译后的java类文件MyNative.class

    结果为:

    这样就简单完成了java调用本地方法。当然,在eclipse中及各种也可以像这样调用本地方法,具体怎么实现,大家可以自己去试试调用各种各样的方法,比如说有返回值的方法,static修饰的方法等。

  • 相关阅读:
    Kmeans中文聚类
    第四周周总结
    数据清洗第一天
    第三周周总结
    关于sqoop上传mysql数据到hive报错的问题
    天津东软实训第十一天——Hive连接JDBC
    天津东软实训第十天——Hive配置
    天津东软实训第九天——MapReduce实战
    天津东软实训第八天------倒排索引
    Intellij IDEA 创建maven项目,利用API操作HDFS
  • 原文地址:https://www.cnblogs.com/UnwillingToMediocrity/p/8304027.html
Copyright © 2020-2023  润新知