Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вызов jni методов из native функций

12K
23 декабря 2005 года
patriotLviv
10 / / 13.10.2005
У меня проблема, не хочет вызыватся метод в моем классе на JAVA из DLL функции.

В принципе метод вызывается из самой функции DLL но когда я создаю новую нить в этой нити происходит сбой
Вот код:
// Serv.cpp : Defines the entry point for the JNI DLL application.
//
#include <winsock2.h>
#include <jni.h>
#include <windows.h>
#include "Cmain.h"
#include <process.h>

SOCKET m_socket;
typedef struct _MyData {
const char* ipa;
int port;
JNIEnv * env;
jobject obj;
} MYDATA, *PMYDATA;

typedef struct _MyDataS {
SOCKET sok;
JNIEnv * env;
jobject obj;
} MYDATAS, *PMYDATAS;
BOOL APIENTRY DllMain( HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;

case DLL_PROCESS_DETACH:
break;
}

return TRUE;
}
DWORD WINAPI SendProc( LPVOID lpParam )
{
PMYDATAS pData;
pData = (PMYDATAS)lpParam;



char recvbuf[32] = "";
int bytesRecv = SOCKET_ERROR;
while(true){
bytesRecv = recv( pData->sok, recvbuf, 32, 0 );


//jclass cls = envr->GetObjectClass(object1);
//jmethodID mid= envr->GetMethodID(cls,"additem","()V");
//envr->CallVoidMethod(object1,mid);

if (bytesRecv!=SOCKET_ERROR){
recvbuf[bytesRecv] = 0;
MessageBox(0,"GetID","",0);
jclass cls = pData->env->GetObjectClass(pData->obj);

jmethodID mid= pData->env->GetMethodID(cls,"additem","()V");

pData->env->CallVoidMethod(pData->obj,mid);
}
else{
ExitThread(0);
return 0;
}
bytesRecv = SOCKET_ERROR;
}
return 0;
}
unsigned __stdcall ListenProc( void* lpParam )
{
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
{
MessageBox(0,"Error at WSAStartup()","Error",0);
WSACleanup();
return 0;
}
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if ( m_socket == INVALID_SOCKET ) {
MessageBox(0,"Error створення сокета","Error :-(",0);
WSACleanup();
return -1;
}
PMYDATA pData;
pData = (PMYDATA)lpParam;
MessageBox(0,pData->ipa,"",0);




pData->env->CallVoidMethod(pData->obj,pData->env->GetMethodID(pData->env->GetObjectClass(pData->obj),"additem","()V"));

sockaddr_in service;

service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( pData->ipa );
service.sin_port = htons( pData->port );
if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
MessageBox(0,"Error binding()","Error :-(",0);
closesocket(m_socket);
return -1;
}


if ( listen( m_socket, 10 ) == SOCKET_ERROR )
MessageBox(0,"Error listening","Error :-(",0);

SOCKET AcceptSocket;

PMYDATAS pDataS;
DWORD dwThreadIdS[30];
HANDLE hThreadS[30];
int i=0;

while(i<30)
{
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
MessageBox(0,"Client connected","GOOD :-)",0);








pDataS = (PMYDATAS)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATAS));

if( pData == NULL )
ExitProcess(2);

// Generate unique data for each thread.

pDataS->sok = AcceptSocket;
pDataS->env=pData->env;
pDataS->obj = pData->obj;

hThreadS = CreateThread(
NULL, // default security attributes
0, // use default stack size
SendProc, // thread function
pDataS, // argument to thread function
0, // use default creation flags
&dwThreadIdS); // returns the thread identifier

i++;

}


ExitThread(0);

return 0;
}
JNIEXPORT jboolean JNICALL Java_Cmain_connect(JNIEnv * envr, jobject ff, jstring ipa, jint prt,jobject object1)
{
PMYDATA pData;
unsigned ThreadId;
HANDLE hThread;
pData = (PMYDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(MYDATA));
const char* ipad =envr->GetStringUTFChars(ipa,0);

// jclass cls = envr->GetObjectClass(object1);

// jmethodID mid= envr->GetMethodID(cls,"additem","()V");

// envr->CallVoidMethod(object1,mid);


pData->ipa = ipad;
pData->port = prt;
pData->env=envr;
pData->obj = object1;
hThread = (HANDLE)_beginthreadex ( NULL, 0, &ListenProc, pData, 0, &ThreadId );
/*hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
ListenProc, // thread function
pData, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier */
WaitForSingleObject( hThread, INFINITE );

return true;
}
JNIEXPORT jboolean JNICALL Java_Cmain_disconnect(JNIEnv *, jobject)
{
return true;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог