• 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修饰的方法等。

  • 相关阅读:
    AcWing 157. 树形地铁系统 (hash判断树同构)打卡
    AcWing 156. 矩阵 (哈希二维转一维查询)打卡
    AcWing 144. 最长异或值路径 01字典树打卡
    AcWing 143. 最大异或对 01字典树打卡
    AcWing 142. 前缀统计 字典树打卡
    AcWing 139. 回文子串的最大长度 hash打卡
    AcWing 138. 兔子与兔子 hash打卡
    常用C库函数功能及用法
    编程实现C库函数
    C语言面试题5
  • 原文地址:https://www.cnblogs.com/UnwillingToMediocrity/p/8304027.html
Copyright © 2020-2023  润新知