In all the examples I have seen, they avoid the problem by never invoking that function directly, thus it never has to link, thus no error. The trick is to lookup the function at runtime and invoke via function pointer. Here is how to do it on Windows. Don't know the syntax for doing it on other operating systems.
[Disclaimer - I copied/pasted code from several functions and may have introduced compiler errors. This may or may not compile but it should get you started]
First create your own typedef for a pointer to the function
typedef jint (JNICALL* JvmCreateProcTypeDef)(JavaVM **, void **, void);
Look up the JVM dll using LoadLibrary. It's up to your application to figure out where to find the JVM DLL. In our case we distributed a 3rd party JRE and knew where to expect the DLL.
HMODULE jvmDll = LoadLibrary(jvmDllPath);
Next lookup the address of the function from the JVM dll using GetProcAddress
JvmCreateProcTypeDef jvmCreateProc = (JvmCreateProcTypeDef) GetProcAddress(jvmDll,"JNI_CreateJavaVM");
Now replace your code which calls the function directly, to something like the following which calls it via function pointer:
jvmCreateProc(&internal::gJVM, (void**)&internal::gEnv, &vm_args);
This should get you passed all the compile link errors. Now all you have to do is deal with the runtime errors when your code cannot find the DLL :)
Hope this helps!