zoukankan      html  css  js  c++  java
  • JNI小试牛刀

    JNI:

      JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境下。

     

    应用:

      First:

        编写类,并添加native方法,不生命不说明具体实现。

              ex:        

     1 package kg.tom;
     2 public class MyJni {
     3 
     4      public native void display();
     5      public native double sum(double x,double y);
     6       
     7 
     8      static {
     9          System.loadLibrary("sum");
    10         }
    11      
    12 
    13     public static void main(String[] args) {
    14 
    15          new MyJni().display();
    16         System.out.println(new MyJni().sum(2.0, 3.0));
    17    
    18        
    19     }
    20      
    21      
    22 }

       Second:

         首先,javac命令编译类文件生成class字节码,javah命令根据class文件生成.h文件。

         ex:

         

      Third:

        编写native C文件。

    //必须的头文件jni.h
    #include <jni.h>   //如果没有设置jni.h的路径到Path,可以把其拷贝到c文件相同目录,修改为 #include “jni.h”
    //导入我们需要实现的本地方法
    #include "kg_tom_MyJni.h"    //需要在c文件目录下
    #include <stdio.h> 
     
    JNIEXPORT void JNICALL Java_kg_tom_MyJni_display
      (JNIEnv *env, jobject obj)
    {
        printf("Hello World tom!!");
        return;
    }
     
    JNIEXPORT jdouble JNICALL Java_kg_tom_MyJni_sum
      (JNIEnv *env, jobject obj, jdouble a, jdouble b)
    {
        return a + b;
    }

          

      Four:

        编译成可链接文件,Windows下编译成dll文件,Linux下编译成so文件。   

        gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at   -Id:/java/include –Id:/java/include/win32   -shared -o sum.dll java_sum_native.c

    命令 简单介绍
    -Wall -D_JNI_IMPLEMENTATION_ 把我们的C文件编译成dll
    -Wl,--kill-at   因为mingw默认是用@来进行分隔,会导致JNI机制不能读取,所以要删掉.. 
    mingw官网解释
    Id:/java/include –Id:/java/include/win32   导入我们用的的jni需要的头文件…盘符,文件夹自己修改
    -shared -o 输出配置,第一个参数为我们输出的名字(随便起),第二个参数为我们的C文件(随便起)
       

     

    image

      Five:

        运行JNI,把编译好的dll放到项目根目录,注意不是代码根目录。

        执行效果:

         

     

  • 相关阅读:
    Jetson AGX Xavier初始化
    Jetson AGX Xavier更换apt-get源
    Mac远程访问Ubuntu
    Anaconda安装和环境的搭建
    C# NotifyIcon 托盘控件
    VS2010+OpenMP的简单使用
    VS2010+OpenCV3.4.1+zbar 64位
    datatbales 使用笔记
    ubuntu16.04 常用软件
    crontab不能正常执行的五种原因
  • 原文地址:https://www.cnblogs.com/udld/p/4580724.html
Copyright © 2011-2022 走看看