基于Linux的JNI動態(tài)函數(shù)注冊

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
)
動態(tài)函數(shù)注冊核心代碼

#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;
/**
?*?
?* 計(jì)算機(jī)處理指令數(shù)的時(shí)間
?*?
**/
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
