JNI c++回调java方法时GetMethodID为0

java代码如下:

package com.qm.scene.sdk;

public class BaseFunction {
    static
    {
        System.loadLibrary("src/main/resources/BaseFunction");
    }

    public native int getTemperature();
    public native boolean AirConditionerControl(boolean bOpen);
    public native float getAngle();
    public native boolean SeatControl(boolean bOpen);
    public native void register(String name,String expression);

    public void onCallback(String name,String value) {
        System.out.println("name = "+name+"value="+value);
    }

    public void onCallback1() {
        System.out.println("name = ");
    }
}


package com.qm.scene.sdk;

public class BaseFunction {
    static
    {
        System.loadLibrary("src/main/resources/BaseFunction");
    }

    public native int getTemperature();
    public native boolean AirConditionerControl(boolean bOpen);
    public native float getAngle();
    public native boolean SeatControl(boolean bOpen);
    public native void register(String name,String expression);

    public void onCallback(String name,String value) {
        System.out.println("name = "+name+"value="+value);
    }

    public void onCallback1() {
        System.out.println("name = ");
    }
}

JNI头文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_qm_scene_sdk_BaseFunction */

#ifndef _Included_com_qm_scene_sdk_BaseFunction
#define _Included_com_qm_scene_sdk_BaseFunction
#ifdef __cplusplus
extern "C" {
#endif
    /*
     * Class:     com_qm_scene_sdk_BaseFunction
     * Method:    getTemperature
     * Signature: ()I
     */
    JNIEXPORT jint JNICALL Java_com_qm_scene_sdk_BaseFunction_getTemperature
    (JNIEnv*, jobject);

    /*
     * Class:     com_qm_scene_sdk_BaseFunction
     * Method:    AirConditionerControl
     * Signature: (Z)Z
     */
    JNIEXPORT jboolean JNICALL Java_com_qm_scene_sdk_BaseFunction_AirConditionerControl
    (JNIEnv*, jobject, jboolean);

    /*
     * Class:     com_qm_scene_sdk_BaseFunction
     * Method:    getAngle
     * Signature: ()F
     */
    JNIEXPORT jfloat JNICALL Java_com_qm_scene_sdk_BaseFunction_getAngle
    (JNIEnv*, jobject);

    /*
     * Class:     com_qm_scene_sdk_BaseFunction
     * Method:    SeatControl
     * Signature: (Z)Z
     */
    JNIEXPORT jboolean JNICALL Java_com_qm_scene_sdk_BaseFunction_SeatControl
    (JNIEnv*, jobject, jboolean);

    /*
     * Class:     com_qm_scene_sdk_BaseFunction
     * Method:    register
     * Signature: (Ljava/lang/String;Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_com_qm_scene_sdk_BaseFunction_register
    (JNIEnv*, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif


c++实现如下:
// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"
#include "jni.h"
#include "jni_md.h"
#include "BaseFunction.h"
#include <iostream>
#include <fstream>
#include <ctime>
#include <thread>
#include <string>
using namespace std;
// 当使用预编译的头时,需要使用此源文件,编译才能成功。

JNIEXPORT jint JNICALL Java_com_qm_scene_sdk_BaseFunction_getTemperature
(JNIEnv*, jclass) {
    ofstream write;
    write.open("D:\\Log.txt", ios::app); //Log输出路径
    srand((unsigned)time(NULL));
    int iLocalTemperature = rand() % 51;//当前车内温度
    cout << "Current Temperature: " << iLocalTemperature << "degrees Celsius\n" <<  endl;
    write << "CurrentTemperature: " << iLocalTemperature << " degrees Celsius\n" << endl;
    write.close();
    return iLocalTemperature;
}
JNIEXPORT jboolean JNICALL Java_com_qm_scene_sdk_BaseFunction_AirConditionerControl
(JNIEnv*, jclass, jboolean bj_open) {
    ofstream write;
    write.open("D:\\Log.txt", ios::app); //Log输出路径
    if (bj_open) {
        cout << "AirConditioner Open!" << endl;
        write << "AirConditioner Open!" << endl;
    }
    else {
        cout << "AirConditioner Close!" << endl;
        write << "AirConditioner Close!" << endl;
    }
    write.close();
    return true;
}

JNIEXPORT jfloat JNICALL Java_com_qm_scene_sdk_BaseFunction_getAngle
(JNIEnv*, jclass) {
    srand((unsigned)time(NULL));
    float fLocalAngle = rand() % 34 + 87;//当前车内座椅角度
    ofstream write;
    write.open("D:\\Log.txt", ios::app); //Log输出路径
    cout << "Current Seat Angle: " << fLocalAngle << "degrees\n"  << endl;
    write << "CurrentTemperature: " << fLocalAngle <<"degrees\n"  << endl;
    write.close();
    return fLocalAngle;
}
JNIEXPORT jboolean JNICALL Java_com_qm_scene_sdk_BaseFunction_SeatControl
(JNIEnv*, jclass, jboolean bj_Adjust) {
    if (bj_Adjust) {
        cout << "Seat adjustment completed!" << endl;
    }
    else {
        cout << "Seat does not adjust!" << endl;
    }
    return true;
}
JNIEXPORT void JNICALL Java_com_qm_scene_sdk_BaseFunction_register
(JNIEnv* env, jobject JavaObj, jstring jstr_TreadId, jstring jstr_Expresion) {
    int iTemperature = 22;
    if (iTemperature) {
        do
        {
            //string strThread = jstr_TreadId;
            string strTemperature = to_string(iTemperature);
            const char* charTemperature = strTemperature.c_str();
            //jstring jstrTemperature = charTojstring(env, charTemperature);
            jstring str_arg;
            str_arg = env->NewStringUTF(charTemperature);
            cout << "CurrentTemperature: " << strTemperature << "degrees\n" << endl;
            ofstream write;
            write.open("D:\\Log.txt", ios::app); //Log输出路径
            write << "CurrentTemperature: " << strTemperature << "degrees\n" << endl;
            write.close();
            //JNIEnv* env;
            //gJavaVM->AttachCurrentThread((void**)&env, NULL);
            cout << "start Get class name" << endl;
            jclass javaClass = env->FindClass("com/qm/scene/sdk/BaseFunction");
            cout << "javaClass:"<< javaClass << endl;
            cout << "Get class name successfully" << endl;

            cout << "start get methed id" << endl; 
            jmethodID javaCallback = env->GetMethodID(javaClass,"onCallback1","()V;");//get到的结果是:000000 
            cout << "javaCallback:" << javaCallback << endl;
            cout << "get methed id successfully" << endl;

            cout << "start onCallback" << endl;
            cout << "env:" << env << endl;
            cout << "JavaObj:" << JavaObj << endl;
            cout << "jstr_TreadId:" << jstr_TreadId << endl;
            cout << "jstr_Expresion:" << jstr_Expresion << endl;
            env->CallVoidMethod(JavaObj, javaCallback);//由于上边Get到的是0,所以调用时出问题了! 
            cout << "onCallback successfully" << endl;

            Sleep(3000);
            iTemperature++;
            free(str_arg);
        } while (iTemperature < 26);
    }


}


运行结果:

img

问题出在哪呢,请指教一下

提供参考实例:https://www.cnblogs.com/jokingremarks/p/15132599.html

为什么JNI中的GetMethodID总是返回0-CSDN论坛
https://zhidao.baidu.com/question/1179462608655800779.html

()V; 
改成
()V