jni调用的本机库中的函数在java中不起作用 我想用JNI调用java程序中的C++原生库函数,但是当调用它时,函数就不能正常工作了。我有这样的代码:
Test.javajni调用的本机库中的函数在java中不起作用 我想用JNI调用java程序中的C++原生库函数,但是当调用它时,函数就不能正常工作了。我有这样的代码:,java,c++,windows,java-native-interface,Java,C++,Windows,Java Native Interface,Test.java public class Test { private static native void Logoff(); private static native void Restart(); private static native void Shutdown(); static { System.loadLibrary("ShutdownImpl"); } public static void main
public class Test {
private static native void Logoff();
private static native void Restart();
private static native void Shutdown();
static {
System.loadLibrary("ShutdownImpl");
}
public static void main(String args[]) {
System.out.println("Write option number: 1-logout 2-restart 3-shutdown");
Scanner s = new Scanner(System.in);
int val = s.nextInt();
switch (val) {
case 1:
Logoff();
break;
case 2:
Restart();
break;
case 3:
Shutdown();
break;
}
s.close();
}
}
shutdownpimpl.c(我的本机库)
#包括
#包括“Test.h”
JNIEXPORT void JNICALL Java_测试_注销(JNIEnv*env,jobject obj)
{
ExitWindowsEx(EWX|U下线| EWX|U力,0);
}
JNIEXPORT void JNICALL Java_Test_Restart(JNIEnv*env,jobject obj)
{
ExitWindowsEx(EWX_重启| EWX_力,0);
}
JNIEXPORT void JNICALL Java_测试_关闭(JNIEnv*env,jobject obj)
{
ExitWindowsEx(EWX_断电| EWX_力,0);
}
当我运行我的程序函数重启或关机时,它根本不工作。只有注销工作正常。我是JNI的新手,所以我不知道我做错了什么。
请帮忙,谢谢你:)
我的代码就是基于这个
编辑:-------------------------------
我从教程中复制代码并尝试运行,我也遇到了同样的问题。程序应该关闭我的电脑-只让我注销,所以我认为问题一定是在不同的地方比代码
编辑2:------------------------------
问题解决了(对我来说:p)。我使用JNA调用本机函数,当我调用
GetLastError()
时,我发现我的应用程序没有足够的权限关闭系统。现在我修复了一切,程序运行正常。当然是因为你的帮助:谢谢大家:你的代码是直接从C++代码>主< /代码>中工作的吗?可能您的用户没有重新启动或关闭计算机的权限。您所说的“完全不工作”是什么意思。JNI函数未调用或异常?性不是你所期望的吗?检查返回值和最后一个错误如何。这将是有价值的信息来帮助你。在C++程序中所有的函数都能正常工作。在Java中调用函数(我在将消息打印到控制台时对此进行了检查),但ExitWindowsEx返回false。调用GetLastError()
查看失败的原因。在教程中的代码中GetLastError()
返回0
,但程序仍然没有做他应该做的事情。他只是让我注销而不是关闭系统。有人能在他的计算机上编译这个代码并检查它是否工作吗?
#include<windows.h>
#include "Test.h"
JNIEXPORT void JNICALL Java_Test_Logoff(JNIEnv *env, jobject obj)
{
ExitWindowsEx(EWX_LOGOFF | EWX_FORCE ,0);
}
JNIEXPORT void JNICALL Java_Test_Restart(JNIEnv *env, jobject obj)
{
ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);
}
JNIEXPORT void JNICALL Java_Test_Shutdown(JNIEnv *env, jobject obj)
{
ExitWindowsEx(EWX_POWEROFF | EWX_FORCE ,0);
}