zoukankan      html  css  js  c++  java
  • JNI之JAVA调用C++接口

    1、JNI定义(来自百度百科)

      JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

    2、java通过JNI调用c++接口步骤

      1)、创建java包、类

        此处创建 包myJNI,类TestJNI

    package myJNI;
    
    public class TestJNI {
        
    }

      2)、在TestJNI类中创建native方法

        此处创建sayHello()方法

    package myJNI;
    
    public class TestJNI {
        public native void sayHello();
    }

      3)、通过javah命令生成C++需要用到的头文件

        下面是我的java工程的目录结构:

        |—eclipse_workspace

           |—TestJNI

           |—src

            |—myJNI

             |—TestJNI.java

        ——用命令行进入java工程所在的目录,进入到与src同级的目录即可

          

        ——用javah命令生成.h文件,因为TestJNI.java在包myJNI中,此时是在src目录下执行命令,所以加上加上包myJNI

          

        ——javah命令执行成功后,在执行命令的目录下(此处为src目录)生成.h文件

          

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

      4)、创建C++工程

        ——新建工程

        

      ——应用程序类型设置为DLL类型

        

      ——将前面生成的.h文件拷贝到C++工程,放到与.cpp同目录下

        

      ——将JDK安装目录include目录下的jni.h 和 include/win32目录下jawt_md.h和jni_md.h拷贝到VS安装目录下的VC/include目录下

           

      ——将C++工程中生成的dll文件拷贝到到环境变量path所包含的目录下,可以在环境变量中查看path所包含的目录

        我的是将TestJNI.dll拷贝至D:Program FilesJavajdk1.7.0_17in中

      ——在C++工程中编写sayHello()方法

      方法名必须与TestJNI.h中的方法名一致,否则出错

    #include<iostream>
    #include"myJNI_TestJNI.h"
    
     JNIEXPORT void JNICALL Java_myJNI_TestJNI_sayHello(JNIEnv *env, jobject obj)
     {
          using namespace std;
          cout<<"hello world!"<<endl;
     }

      5)、编写java程序,在java中调用C++的sayHello()接口

      ——System.loadLibrary("TestJNI")是加载dll文件,该文件名称必须为C++工程生成的dll文件名称;

      ——testJNI.sayHello()及调用C++实现的接口;

    package myJNI;
    
    public class TestJNI {
        public native void sayHello();
        public static void main(String[] args) {
            System.loadLibrary("TestJNI");
            TestJNI testJNI = new TestJNI();
            testJNI.sayHello();
        }
    }

      6)、运行java程序,打印结果为 hello world!  表明通过JNI调用C++接口成功。

        

  • 相关阅读:
    Docker
    Web
    爬虫
    Python
    软件脱壳
    网络抓包
    HTTPS单向认证,双向认证
    新版无完整背景图片滑块验证码
    Frida Hook
    闭包函数与装饰器
  • 原文地址:https://www.cnblogs.com/sunseine/p/3964828.html
Copyright © 2011-2022 走看看