Hi All,
I used JNI to call Vix API base on Fedora 7 OS. Bug I have a problem when running the program. Here is the exception message:
"Exception in thread "main" java.lang.UnsatisfiedLinkError: vixHostConnect
at VixNative.vixHostConnect(Native Method)
at VixNative.main(VixNative.java:79)"[/b]. It seems the java code can't wrap to the c function Java_VixNative_vixHostConnect[/b].
here is the code:
//VixNative.java
public class VixNative {
public native static int vixHostConnect(
String hostName,
String userName,
String password,
int portNumber
);
public native static void vixHostDisconnect(
int handle
);
public native static void vixHostRegisterVM(
int hostHandle,
String configFile
);
public native static void vixHostUnregisterVM(
int hostHandle,
String configFile
);
public native static int vixVMOpen(
int hostHandle,
String configFile
);
public native static void vixVMPowerOn(
int vmHandle
);
public native static void vixVMPowerOff(
int vmHandle
);
public native static void vixVMSuspend(
int vmHandle
);
public native static void vixVMReset(
int vmHandle
);
public native static void vixVMWaitForToolsInGuest(
int vmHandle
);
public native static int vixGetProperties(
int vmHandle
);
public native static String vixGetErrorText(
int err,
String locale
);
public native static void vixVMLoginGuest(
int vmHandle,
String userName,
String password
);
static{
System.loadLibrary("VixNative");
}
public static void main(String[] args) {
try{
int hostHandle = 0;
int vmHandle = 0;
hostHandle = VixNative.vixHostConnect("192.168.1.10", "root", "jcmuser", 904);
vmHandle = VixNative.vixVMOpen(hostHandle, "/root/Documents/Test/VirtualMachines/SupportCases/WinXP Professional/CaseDir_60/SCase_50004/CurrentImage/Windows XP Professional.vmx");
VixNative.vixVMPowerOn(vmHandle);
VixNative.vixVMWaitForToolsInGuest(vmHandle);
VixNative.vixVMLoginGuest(vmHandle, "user", "123");
//VixNative.VixVMPowerOff(vmHandle);
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
//VixNative.c
#include "vix.h"
#include "VixNative.h"
#include <stdio.h>
#ifndef __VixNative__
#define __VixNative__
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT jint JNICALL Java_VixNative_vixHostConnect (JNIEnv * env, jclass cl, jstring hostName, jstring userName, jstring password, jint portNumber){
VixHandle hostHandle = VIX_INVALID_HANDLE;
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
const char *cHostName = env->GetStringUTFChars(hostName, 0);
const char *cUserName = env->GetStringUTFChars(userName, 0);
const char *cPassword = env->GetStringUTFChars(password, 0);
jobHandle = VixHost_Connect(
VIX_API_VERSION,
VIX_SERVICEPROVIDER_VMWARE_SERVER,
cHostName, // *hostName,
portNumber, // hostPort,
cUserName, // *userName,
cPassword, // *password,
0, // options,
VIX_INVALID_HANDLE, // propertyListHandle,
NULL, // *callbackProc,
NULL);
err = VixJob_Wait(
jobHandle,
VIX_PROPERTY_JOB_RESULT_HANDLE,
&hostHandle,
VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
if(VIX_OK != err){
hostHandle = 0;
}
return hostHandle;
}
JNIEXPORT void JNICALL Java_VixNative_vixHostDisconnect (JNIEnv* env, jclass cl, jint hostHandle){
VixHost_Disconnect(hostHandle);
}
JNIEXPORT void JNICALL Java_VixNative_vixHostRegisterVM (JNIEnv* env, jclass cl, jint hostHandle, jstring configFile){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
const char *cConfigFile = env->GetStringUTFChars(configFile, 0);
jobHandle = VixHost_RegisterVM(
hostHandle,
cConfigFile,
NULL,
NULL);
err = VixJob_Wait(
jobHandle,
VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
JNIEXPORT void JNICALL Java_VixNative_vixHostUnregisterVM (JNIEnv* env, jclass cl, jint hostHandle, jstring configFile){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
const char *cConfigFile = env->GetStringUTFChars(configFile, 0);
jobHandle = VixHost_UnregisterVM(
hostHandle,
cConfigFile,
NULL,
NULL);
err = VixJob_Wait(
jobHandle,
VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
JNIEXPORT jint JNICALL Java_VixNative_vixVMOpen (JNIEnv* env, jclass cl, jint hostHandle, jstring configFile){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixHandle vmHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
const char *cConfigFile = env->GetStringUTFChars(configFile, 0);
jobHandle = VixVM_Open(
hostHandle,
cConfigFile,
NULL,
NULL);
err = VixJob_Wait(
jobHandle,
VIX_PROPERTY_JOB_RESULT_HANDLE,
&vmHandle,
VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
if(VIX_OK != err){
vmHandle = 0;
}
return vmHandle;
}
JNIEXPORT void JNICALL Java_VixNative_vixVMPowerOn (JNIEnv* env, jclass cl, jint vmHandle){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
jobHandle = VixVM_PowerOn(vmHandle,VIX_HOSTOPTION_USE_EVENT_PUMP,VIX_INVALID_HANDLE,NULL,NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
JNIEXPORT void JNICALL Java_VixNative_vixVMPowerOff (JNIEnv* env, jclass cl, jint vmHandle){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
jobHandle = VixVM_PowerOff(
vmHandle,
VIX_VMPOWEROP_NORMAL,
NULL, // *callbackProc,
NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
JNIEXPORT void JNICALL Java_VixNative_vixVMSuspend (JNIEnv* env, jclass cl, jint vmHandle){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
jobHandle = VixVM_Suspend(
vmHandle,
VIX_VMPOWEROP_NORMAL,
NULL, // *callbackProc,
NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
JNIEXPORT void JNICALL Java_VixNative_vixVMReset (JNIEnv* env, jclass cl, jint vmHandle){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
jobHandle = VixVM_Reset(
vmHandle,
VIX_VMPOWEROP_NORMAL,
NULL, // *callbackProc,
NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
JNIEXPORT void JNICALL Java_VixNative_vixVMWaitForToolsInGuest (JNIEnv* env, jclass cl, jint vmHandle){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
jobHandle = VixVM_WaitForToolsInGuest(
vmHandle,
300,
NULL,
NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
JNIEXPORT jint JNICALL Java_VixNative_vixGetProperties (JNIEnv* env, jclass cl, jint vmHandle){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
VixHandle vmState = VIX_INVALID_HANDLE;
jobHandle = Vix_GetProperties(
vmHandle,
VIX_PROPERTY_JOB_RESULT_HANDLE,
&vmState,
VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
return vmState;
}
JNIEXPORT jstring JNICALL Java_VixNative_vixGetErrorText (JNIEnv* env, jclass cl, jint err, jstring cLocale){
const char * cLocale = env->GetStringUTFChars(locale, 0);
jstring errText = env->NewStringUTF(Vix_GetErrorText(err, cLocale));
return errText;
}
JNIEXPORT void JNICALL Java_VixNative_vixVMLoginGuest (JNIEnv* env, jclass cl, jint vmHandle, jstring userName, jstring password){
VixHandle jobHandle = VIX_INVALID_HANDLE;
VixError err = VIX_OK;
const char *cUserName = env->GetStringUTFChars(userName, 0);
const char *cPassword = env->GetStringUTFChars(password, 0);
jobHandle = VixVM_LoginInGuest(vmHandle, cUserName, cPassword, 0, NULL, NULL);
err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE);
Vix_ReleaseHandle(jobHandle);
}
#ifdef __cplusplus
}
#endif
#endif /* __VixNative__ */
I used the following command to compile the c code. I copied all files which are needed to current directory.
gcc -shared -o libVixNative.so VixNative.c /usr/lib/libvmware-vix.so.0[/b]
I thought it may be the compile command problem. Because the java code can load the VixNative library, but can't find the c functions.
Could any body help me?
Thanks.