欢迎光临散文网 会员登陆 & 注册

基于Linux的JNI动态函数注册

2020-10-09 17:16 作者:开源开发者  | 我要投稿



cmake_minimum_required(VERSION 3.2)


project(AlgorithmLibrary)


set(ProjectDir ${CMAKE_CURRENT_SOURCE_DIR})


set(LIBRARY_OUTPUT_PATH ${ProjectDir}/lib)


set(DynamicRegisterDir ${CMAKE_CURRENT_SOURCE_DIR}/DynamicRegister/)


include_directories(


    ./include /opt/jdk1.8.0_201/include/ 


    ${DynamicRegisterDir}


    TimeComplexity/


    Test/


)


add_library(

    

    AlgorithmLibrary SHARED 


    ${DynamicRegisterDir}/DynamicRegisterMethod.cpp


    TimeComplexity/InstrucNumTime.cpp


    Test/Test.cpp


)

动态函数注册核心代码


#ifndef DynamicRegisterMethod

#define DynamicRegisterMethod

#include <Common.h>

#include <InstrucNumTime.h>

#include <Test.h>

#endif


#include <DynamicRegisterMethod.h>


using namespace std;


char* javaClass []  = {


    (char*)"com/ossit/demo01/App",


};


static JNINativeMethod getMethod[1][2] = {


    {

        {(char*)"printInstructionTime",(char*)"()V",(void*)printInstructionTime},

        {(char*)"test",(char*)"()V",(void*)test}

       

    }

    

};


int registerNativeMethods(JNIEnv* env,const char* name,

    JNINativeMethod* methods,jint nmethods){


    jclass jcls;

    

    jcls = env->FindClass(name);


    if(jcls == NULL) {


        return JNI_FALSE;



    }


    if(env->RegisterNatives(jcls,methods,nmethods) < 0){


        return JNI_FALSE;


    }

    

    return JNI_TRUE;


}



JNIEXPORT int JNICALL JNI_OnLoad(JavaVM* vm,void* reserved){

    

    JNIEnv* env;


    if(vm->GetEnv(reinterpret_cast<void**>(&env),JNI_VERSION_1_6) != JNI_OK){


        return JNI_FALSE;


    }


    int count=0;


    for(int i=0;i < sizeof(javaClass)/sizeof(javaClass[0]);i++){

        

        for(int j=0;j< sizeof(getMethod[i])/sizeof(getMethod[i][0]);j++){

            

            if(getMethod[i][j].fnPtr != NULL){


                count++;

                

            }

        }


        registerNativeMethods(env,javaClass[i],&getMethod[i][0],count);


        count = 0;

    }


    cout << "LoadAlgorithmLibrary" << endl;

    

    return JNI_VERSION_1_6;

}

#ifndef Common

#define Common

#include <jni.h>

#include <iostream>

#include <stdio.h>


#endif


#ifndef Test

#define Test

#include <Common.h>

void test();

#endif

#include <Test.h>


void test(){

    int l;

    short s;

    char c;


    l =  0xabcddcba;

    s = l;

    c = l;


    printf("宽度溢出\n");

    printf("l = 0x%x (%d bits)\n", l, sizeof(l) * 8);

    printf("s = 0x%x (%d bits)\n", s, sizeof(s) * 8);

    printf("c = 0x%x (%d bits)\n", c, sizeof(c) * 8);


    printf("整型提升\n");

    printf("s + c = 0x%x (%d bits)\n", s+c, sizeof(s+c) * 8);

}

#include <InstrucNumTime.h>

#include <cmath>

#include <ctime>


using namespace std;


/**

 * 

 * 计算机处理指令数的时间

 * 

**/




void printInstructionTime(){

    

  



    for(jint i=1;i<=9;i++){

        


        jint number = pow(10,i);


        clock_t startTime = clock();


        jint sum = 0;


        for(jint j=0;j<number;j++){

            sum += j;

        }

   

        clock_t endTime = clock();


        cout << "10^" << i << " : " << (jdouble)(endTime-startTime)/CLOCKS_PER_SEC << "s" << endl;

      

    }


}

#ifndef InstrucNumTime

#define InstrucNumTime

#include <Common.h>

void printInstructionTime();

#endif


基于Linux的JNI动态函数注册的评论 (共 条)

分享到微博请遵守国家法律