2011-12-08 1 views
4

안드로이드 JNI에서 자바와 네이티브 C 변수를 즉시 공유 할 수있는 방법이 있습니까?android JNI에서 Java와 C 사이에서 변수를 공유하는 방법은 무엇입니까?

서버가 C++ (구조체 읽기/쓰기 관련)로 작성되고 배열 변수에 데이터가 들어오는 상황을 기록하고 Java에서 해당 변수를 감지하고 싶기 때문에 클라이언트의 C 계층에서 데이터를 수신하고 싶습니다. 가능하다면 무엇이 상응 하는가?

나는 데이터 다가오는 상황에 관한 파일을 sdcard로 작성하는 것을 고려했다.

답변

0

나는 어떤 안드로이드도하지 않았기 때문에 이것을 소금 한알로 가져 가라. 아마 직접 바이트 버퍼를 사용할 수있을 것이다. 문제는 무언가가 일어 났음을 알게 될 것입니다. 단순히 버퍼를 폴링 할 수는 있지만 JNI를 사용하여 값을 폴링하는 것보다 훨씬 좋을 것입니다.

일반적인 java에서는 사람들이 위험을 무릅 쓰고 자한다면 sun.misc.Unsafe 클래스를 이용할 수 있습니다. 그 클래스가 안드로이드에 존재하는지 잘 모르겠지만, 아마도 이것은 Unsafe class in Android?을 도울 것입니다.

1

최근에이 문제가 발생하여이를 해결할 수있었습니다. 일부 Java 코드 (안드로이드 SDK에서 액세스 할 수있는 물건)를 실행해야하는 C++ Qt Android 프로젝트가 있습니다. 이를 위해 자바와 C++ 코드 사이에서 상수를 공유해야했습니다 (서로 이야기하고 서로 이해하도록하기 위해). (자바는 C++을 호출하는 경우, 또는 주위 방향)에 따라 생성 된 Java 오브젝트에 상수 값을 전달 ++

  • 유무 C :

    여기 가능한이를위한 해결책이다. 그러나 많은 변수가 있다면 그것은 근사합니다.

  • C++ 및 Java 모듈에서 동적으로 구문 분석 된 구성 파일을 보유하십시오. 작동해야하지만 시도하지 않았습니다.
  • 는 모두 C++ 및 Java
  • 드디어 마지막 솔루션 작업을했다

에 의해 두 곳의 변수 .... 나쁜 생각과

  • 직접 사용 선언 파일 ('포함')를 가지고 유지하기 위해 하드를 선언합니다. 아이디어는 Java 파일을 C++과 Java에서 모두 사용하는 것입니다 (이 방법은 주위에서 작동 할 수 있지만 C++ 사용자이므로이 방법이 더 쉬워 보입니다). 그리고 우리는이 java 파일을 헤더 파일로 C++에 포함되도록 유효하게하기 위해 프리 프로세서를 사용합니다!
    package name1.name2.name3; 
    import java.lang.String; 
    
    class MyConstants 
    { 
        public static String THE_NAME() { return "Name"; } 
        public static Integer THE_VALUE() { return 12; } 
    }; 
    

    변수에 액세스하는 자바 코드에서 문제없이 사용할 수있다 : 여기서

    자바 파일 (constants.java) 상수 (정수 및 문자열)를 선언의 일례이다. 지금, 여기에 C에서 ++ 파일을 포함하는 방법은 다음과 같습니다

    #include <string> 
    using namespace std; 
    #define public public: 
    #define package struct mockup1 { int name3; };struct mockup2 { mockup1 name2; };int i1 = 
    #define name1 mockup2() 
    #define import struct mockup3 { int String; };struct mockup4 { mockup3 lang; };int i2 = 
    #define java mockup4() 
    #define String string 
    #define Integer int 
    
    #include "constants.java" 
    
    #undef public 
    #undef String 
    #undef package 
    #undef import 
    #undef java 
    #undef name3 
    

    사전 프로세서는이 유효한 C++ 헤더 파일에 constants.java 파일을 (주 difficuly 패키지 및 수입 라인의 탐을 얻을 수 있었다 변경 당신 때문에 매크로 이름에 도트를 사용할 수 없습니다.) :

    struct mockup1 { int name3; };struct mockup2 { mockup1 name2; };int i1 = mockup2().name2.name3; 
    struct mockup3 { int String; };struct mockup4 { mockup3 lang; };int i2 = mockup4().lang.String; 
    
    class MyConstants 
    { 
        public: static string THE_NAME() { return "Name"; } 
        public: static int THE_VALUE() { return 12; } 
    }; 
    

    여기에 C++로 상수가 있습니다!

    int main() 
    { 
        cout << MyConstants::THE_NAME() << MyConstants::THE_VALUE() << endl; 
    
        return 0; 
    } 
    
  • 관련 문제