This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Error while creating jvm in DLL


Hi,
Iâve written a custom odbc driver to execute some complex queries using
Tomcat Server.

MS ACCESS loads the dll (through system DSN) I created and links the table
to oracle using my odbc drier.

The problem:

Inside the dll Iâm creating a jvm which talks to the tomcat server.

When I run a sample application locally it works just fine (in the sense,
the jvm gets created and connection to tomcat etc etc.)

But when I try to run it through ODBC bridge, the dll is not able to create
the JVM: 

It throws an exception : 

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x10004e86, pid=4184,
tid=4716
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0-b64 mixed mode)
# Problematic frame:
# C  [aces_odbc_driver.dll+0x4e86]
#

Stack: [0x00040000,0x00080000),  sp=0x0007ecf0,  free space=251k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native
code)
C  [aces_odbc_driver.dll+0x4e86]
C  [aces_odbc_driver.dll+0x1ad2d]
C  [ODBC32.dll+0x9260]
C  [ODBC32.dll+0x3004]
C  [ODBC32.dll+0x2fbc]
C  [ODBC32.dll+0x328f9]
C  [JdbcOdbc.dll+0x4c6d]
j  sun.jdbc.odbc.JdbcOdbc.driverConnect(J[B[B)V+0
j  sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JLjava/lang/String;)V+93
j 
sun.jdbc.odbc.JdbcOdbcConnection.initialize(Ljava/lang/String;Ljava/util/Properties;I)V+984
j 
sun.jdbc.odbc.JdbcOdbcDriver.connect(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;+129
j 
java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/util/Properties;Ljava/lang/ClassLoader;)Ljava/sql/Connection;+165
j 
java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;+41
j  SimpleSelect.main([Ljava/lang/String;)V+23

Iâ was trying to use a simple java program to test the functionality. 

Here is the sample java code.

import java.net.URL;
import java.sql.*;

class SimpleSelect {


      public static void main (String args[]) {
      	String url   = "jdbc:odbc:aptest";
      	String query = "SELECT * FROM emp";

      	try {

      		// Load the jdbc-odbc bridge driver

      		Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

      		DriverManager.setLogStream(System.out);

      		// Attempt to connect to a driver.  Each one
      		// of the registered drivers will be loaded until
      		// one is found that can process this URL

      		Connection con = DriverManager.getConnection (
      			url, "abc", "abc");

      		// If we were unable to connect, an exception
      		// would have been thrown.  So, if we get here,
      		// we are successfully connected to the URL



<Here is the code in the myodbc  dll for which the DSN is created>

typedef _JNI_IMPORT_OR_EXPORT_ jint (JNICALL *JNI_JVMPROC) (JavaVM **,void
**,void *);

	JNI_JVMPROC ProcAdd;
	if(env == NULL  || jvm == NULL) 
	{

		options[0].optionString = "-Djava.class.path=ârequired path given for
jarsâ	
	//	options[1].optionString = "-verbose:jni";
		
		vm_args.version = JNI_VERSION_1_2;
		vm_args.options = options;
		vm_args.nOptions = 1;
		
		vm_args.ignoreUnrecognized = JNI_TRUE;
		
		//		JNI_GetDefaultJavaVMInitArgs(&vm_args);
		

  if (!getcwd(buffer, 512)) { /* returns null if path is too long */
    cout << "Path name is too long \n" ;
  }
  else {
    cout << "Current Working Directory is " <<  buffer;
  }

		cout << "\n\n**************Loading jvm.dll library****************\n\n";
		hinstLib =  LoadLibrary("jvm.dll");

		if (hinstLib ==  NULL) 
		{

		cout << "\n\n**************Failed Loading jvm.dll
library****************\n\n";
		}

		ProcAdd = (JNI_JVMPROC) GetProcAddress(hinstLib, "JNI_CreateJavaVM"); 

		if(ProcAdd != NULL ) {

			cout << "------------Proc address got is : --------" << ProcAdd;
		}

		res = (ProcAdd) (&jvm,(void**)&env,&vm_args); 	
		//res = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
		cout <<res;
		if (res < 0) 
		{
			cerr<< "\n\n Can't create Java VM FROM Swapnil"  << endl;
			if (env->ExceptionOccurred()) 
			{
				env->ExceptionDescribe();
				env->ExceptionClear();
			}
			cout<< "Destroying JVM" << endl;
			jvm->DestroyJavaVM();
		}
	}

I tried using the simple way of creating the jvm also but didnât work out.
The same code works when I load the dll directly in a sample program 

I checked the path , environment variables as well. The only problem is jvm
is not created when I try to invoke it from dll through ODBC32.dll

Any help would be appreciated.


-----
Swapnil Kale ï Think before you print
________________________________________
:working:
-- 
View this message in context: http://www.nabble.com/header-file-to-include-java-classes--tp14416171p15330277.html
Sent from the gcc - java mailing list archive at Nabble.com.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]