Это сбой, потому что Java_com_myorg_MyJavaClass_createNewMyStruct объявляется как возвращающий «jobject», но на самом деле возвращает struct MyStruct. Если вы запускаете это с включенным CheckJNI, виртуальная машина будет громко жаловаться и прерываться. Функция processData () также будет довольно расстроена из-за того, что она передается в «аргументах».
Рабочий объект - объект на управляемой куче. Он может иметь дополнительный материал до или после объявленных полей, и поля не должны быть выложены в памяти в каком-либо конкретном порядке. Таким образом, вы не можете сопоставить структуру C над классом Java.
Самый простой способ справиться с этим был идентифицирован в более раннем ответе: манипулировать заданием с помощью функций JNI. Выделите объекты с Java или с помощью NewObject, Get / Set полей объекта с соответствующими вызовами.
Существуют различные способы «обманывать» здесь. Например, вы можете включить байт [] в свой Java-объект, который содержит байты sizeof (struct MyStruct), а затем использовать GetByteArrayElements, чтобы получить указатель на него. Немного уродливый, особенно если вы хотите получить доступ к полям со стороны Java.
РЕШЕНИЕ:
DECLARE @SERVERNM sysname;
SET @SERVERNM = 'SERVER='+CAST(CONNECTIONPROPERTY('local_net_address') AS sysname)+'\'+CAST(SERVERPROPERTY('InstanceName') AS sysname)+';Trusted_Connection=yes;'
DECLARE @TEST NVARCHAR(MAX)
SET @TEST = QUOTENAME(@SERVERNM,'''')
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT *' + NCHAR(13) + NCHAR(10) +
N'FROM OPENROWSET(''SQLOLEDB'',' + NCHAR(13) + NCHAR(10) +
N' ' + @TEST + ',' + NCHAR(13) + NCHAR(10) +
N' ''set fmtonly off;exec DW..P750106119 @ENT_NR_VERSAO=1'');'
EXEC sp_executesql @SQL;