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);
}
}
运行结果:
问题出在哪呢,请指教一下
提供参考实例:https://www.cnblogs.com/jokingremarks/p/15132599.html
为什么JNI中的GetMethodID总是返回0-CSDN论坛
https://zhidao.baidu.com/question/1179462608655800779.html
()V;
改成
()V