2012-11-05 4 views
2

서버와 통신해야하는 jni-client-software로 작업 중입니다. 연결을 설정할 수 있으며, 필요한 정보를 읽고이를 내 Java 프로그램에 돌려 줄 수 있습니다. 이제 연결이 무한대로 연결되기를 바랍니다. 연결이 설정되고 정보가 무한 루프에서 읽혀 져야합니다. (모든 jni-function 호출을 끊고 다시 연결하고 싶지 않습니다.) 그것은 작동 자바 스크립트에서 바이트 배열을 전달할 수 있습니까?Android : jni 스레드에서 Java 프로그램으로 데이터 전달하기

대단히 감사합니다.

종류가

토마스

+0

처음부터 자바에서 서버 통신을하는 것이 어떻습니까? – technomage

+0

java에서 jni로 서버 연결을 전달하려면 어떻게해야합니까? – user1744012

+0

JNI 대신 Java에서 동일한 작업을 수행하지 못하게하는 "jni-client-software"의 특별한 점은 무엇입니까? – technomage

답변

1

에 관하여 "그것은 내 자바을 programm에 작업 JNI 트레드에서 바이트 배열을 전달 할 수 있습니까?"

Java 클래스 중 하나에서 정적 메서드를 만든 다음이 메서드를 jni 코드 내의 매개 변수로 호출 할 수 있습니다. 여기에 몇 가지 코드는 다음과 같습니다

자바 측 :

package com.mysuper.game; 
public class MyApp { 
    public static void callMeFromJNI(byte[] data) { 
     // ... 
    } 
} 

및 작업자 스레드에서 C++ 코드를 실행 :

Java Native Interface 6.0 Specification

:이 작품에 어떻게 보이는지에 대한 자세한 내용은

JavaVM *vm; 
// use vm->AttachCurrentThread(&env, 0); in thread function to get valid JNI interface pointer, on thread end use DetachCurrentThread(). 
JNIEnv *env; 

void myFunc() { 

    // some test data to send 
    const int len = 32; 
    char data[len] = {0,1,2,3,4}; 

    jclass app = env->FindClass("com/mysuper/game/MyApp"); 
    jmethodID sendDataToJava = env->GetStaticMethodID(app, "callMeFromJNI", "([B)V"); 
    jbyteArray bArray = env->NewByteArray(len); 
    char *bytes = (char *)env->GetByteArrayElements(bArray, 0); 
    memcpy(bytes, data, len); 
    env->ReleaseByteArrayElements(bArray, bytes, JNI_ABORT); 
    env->CallStaticVoidMethod(app, sendDataToJava, bArray); 
} 

+0

"env ... from JNI_OnLoad"를 사용할 수 없습니다. JavaVM에 대한 정적 참조를 유지해야하며, 먼저 원시 스레드를 접속 한 다음 새로운 JNIEnv 포인터를 확보해야합니다. 일반적으로, 어느 thread로 취득한 JNIEnv 포인터를 다른 thread로 유효하게 사용하면 안됩니다. – technomage

+0

이것을 지적 해 주셔서 감사 드리며이 부분을 편집했습니다 – marcinj

+0

어떻게 JNIEnv 포인터를 가져 옵니까? – usman

관련 문제