JNI 与 JNR 实现代码上的差异

    xiaoxiao2021-03-26  3

    JNI 样例

    Java:文件

      packageclass com_paxos_jni;  

      public class TestNativeCode{  

         //定义一个本地方法  

         public native void testJNI();  

         public static void main(String[] args){  

             //调用动态链接库  

           System.loadLibrary("TestNativeCode");  

             TestNativeCode testNativeCode= new TestNativeCode ();  

            testNativeCode. testJNI ();  

         }  

    C语言头文件

    #include<jni.h>

    /* Header forclass com_paxos_jni_TestNativeCode */

     

    #ifndef_Included_com_paxos_jni_TestNativeCode

    #define_Included_com_paxos_jni_TestNativeCode

    #ifdef__cplusplus

    extern"C" {

    #endif

    /*

     * Class:    com_paxos_jni_TestNativeCode

     * Method:   sayHello

     * Signature: ()V

     */

    JNIEXPORT voidJNICALL Java_com_paxos_jni_TestNativeCode_testJNI

      (JNIEnv *, jobject);

     

    #ifdef__cplusplus

    }

    #endif

    #endif

     

    C语言实现

    #include<iostream>

    #include"com_paxos_jni_TestNativeCode.h"

     

    JNIEXPORT voidJNICALL Java_com_paxos_jni_TestNativeCode_testJNI

      (JNIEnv *, jobject){

        //实现逻辑

    cout<<"Hello World"<<endl; 

      }

     

    JNR样例

    Java:文件

    package com.paxos.jni;

    import jnr.ffi.LibraryLoader;

    public class Test {

             publicstatic interface MathTest {

                       voidsayHello();

        } 

     

        publicstatic void main(String[] args) { 

                 MathTest libc = LibraryLoader.create(MathTest.class).load("nativeCode2"); 

                 libc.sayHello();

        }

    }

     

    C语言头文件

    #ifndef__MAIN_H__

    #define__MAIN_H__

     

    #include<windows.h>

     

    /*  To use this exported function of dll, includethis header

     *  inyour project.

     */

     

    #ifdefBUILD_DLL

        #define DLL_EXPORT __declspec(dllexport)

    #else

        #define DLL_EXPORT __declspec(dllimport)

    #endif

     

     

    #ifdef__cplusplus

    extern"C" //这里必须写明编译类型,否者报错

    {

    #endif

     

    __declspec(dllexport)void __stdcall sayHello();

     

    #ifdef__cplusplus

    }

    #endif

     

    #endif// __MAIN_H__

     

    C语言实现

    #include"main.h"

    #include<iostream>

    usingnamespace std;

     

    void sayHello ()

    {

    cout<<"Hello World"<<endl;

    }

    差异:

    1.      不需要特别的生成对应的jni接口,省去生成头文件的麻烦。

    2.      jnr开发人员可以不具备C语言能力,直接调用。

    3.      使用JNI技术,不仅可以实现Java访问C函数,也可以实现C语言调用Java代码。

    4.      Jnr引入的第三方jar包使用更简便。

    综述:

    1.      如果不涉及到C与JAVA互相调用场景,推荐jnr,否者相反。

    2.      当对内存和效率要求高的时候,还是要推荐使用jni.

    转载请注明原文地址: https://ju.6miu.com/read-500161.html

    最新回复(0)