zoukankan      html  css  js  c++  java
  • Java笔记 #05# Java Native Interface

    参考资料:http://www.ntu.edu.sg/home/ehchua/programming/java/javanativeinterface.html(很详细)

    看jdk源代码时,经常会看到类似下面的代码:

    private native int read0() throws IOException; 

    该类接口需要由c/c++实现。言下之意,它的实现与特定操作系统密切相关。

    1、尝试自己实现一个简单的native接口:

    public class TestNativeMethod {
    
        public static native void sayHello();
        
        static {
            System.loadLibrary("sayHello_impl");
        } 
    
        public static void main(String[] args) {
            sayHello();
        }
    }

    直接编译是ok的,不过没法正常运行:

    mdzz@LAPTOP-QGECNCGO MINGW64 /d/lab2
    $ javac TestNativeMethod.java
    
    mdzz@LAPTOP-QGECNCGO MINGW64 /d/lab2
    $ java TestNativeMethod
    java.lang.UnsatisfiedLinkError: no sayHello_impl in java.library.path
            at java.lang.ClassLoader.loadLibrary(Unknown Source)
            at java.lang.Runtime.loadLibrary0(Unknown Source)
            at java.lang.System.loadLibrary(Unknown Source)
            at TestNativeMethod.<clinit>(TestNativeMethod.java:6)
    Exception in thread "main"

    2、通过javah -jni TestNativeMethod命令得到TestNativeMethod.h(c/c++版本的“接口”):

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class TestNativeMethod */
    
    #ifndef _Included_TestNativeMethod
    #define _Included_TestNativeMethod
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     TestNativeMethod
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_TestNativeMethod_sayHello
      (JNIEnv *, jclass);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

    3、书写相应的C/C++实现sayHello_impl.cpp

    #include "TestNativeMethod.h"
    #include <stdio.h>
    
    JNIEXPORT void JNICALL Java_TestNativeMethod_sayHello(JNIEnv *, jclass) {
        printf("Hello, this is a native method.
    ");
    }

    4、这个时候编译.cpp文件是100%报错的,你需要找到本地jdk文件夹内的两个.h文件:jni.h以及jni_md.h然后添加过去。。。。。。。然后设法将jni_md.h、sayHello_impl.cpp、TestNativeMethod.h、jni.h弄成一个sayHello_impl.ddl文件。

    PS. 本人没弄成功,好不容易弄出ddl,运行程序时却报了32bit的ddl和64bit平台不兼容,更新mingw64老半天进度条又没动静,so。。。。。。。。。

    5、最后再次运行TestNativeMethod就行了。所以native接口的实现是可以通过动态更改ddl而修改的。

  • 相关阅读:
    tensorflow几个常见错误
    15、TDM模型
    算法97:成绩排名---动态规划
    推荐阅读论文
    Reservoir Sampling 蓄水池采样算法
    14、RALM: 实时 look-alike 算法在推荐系统中的应用
    NLP传统基础(3)---潜在语义分析LSA主题模型---SVD得到降维矩阵
    【SqlServer】SqlServer中的计算列
    【SQL】数据库中的五种约束
    【.NET】SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间
  • 原文地址:https://www.cnblogs.com/xkxf/p/10268856.html
Copyright © 2011-2022 走看看