2013-07-27 4 views
0

나는 Android 초보자입니다. 그리고 기존의 Android 네이티브 메소드를 활용하는 Java 클래스를 작성하고 싶습니다. 간단한 예로서 FloatMath 클래스 내에서 floor 메서드를 노출하려고 시도했습니다. 그러나 이로 인해 앱이 강제 종료됩니다. 아래 코드를 복사했습니다. 꽤 간단하며 v1.6을 타겟으로합니다. 그래서 나는 분명한 뭔가 빠진 것이 있는지 물어볼 수 있습니까? 특수 라이브러리 또는 컴파일러를 가져와야합니까? 편지 fAndroid에서 표준 기본 메소드를 호출하는 방법은 무엇입니까?

float inputFloat = (float) 2.3f; 
+1

는 – Desert

+0

은 당신이 당신의 기능을 수행 할 좋아합니까 스택 추적을 게시? fnc를 사용하고 싶다면'double myvar = Math.floor (arg);' – Alex

+0

'Math.floor'를 호출하지 않는 이유는 무엇입니까? –

답변

4

당신은이 방법을 수행하려고하는 일을 할 수 없습니다를 추가

public class MainActivity extends Activity { 

    public static native float floor(float value); 

    float inputFloat = (float) 2.3; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     float outputFloat = floor(inputFloat); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 
+0

정확하게 내 질문에 답합니다. 고맙습니다. 궁극적 인 목표는 싱글 톤 제한없이 수정 된 JetPlayer 클래스를 만드는 것입니다. 생성자가 private이기 때문에 생각만큼 쉽지 않습니다. 내가 할 수있는 그림) 자바에서 JetPlayer에 직접 클래스 수술을 수행하는 반사를 사용하거나 B) 같은 기본 방법을 사용하여 사용자 정의 JetPlayer를 작성하십시오. 당신의 대답에 따라 옵션 B는 아마도 libmedia.so에서 dlopen을 수행해야 할 것처럼 보이기 때문에 비현실적 일 수 있습니다 - 플랫폼 지네 병을여십시오. OTOH, 반성은 거의 호소하지 않는 것처럼 보입니다. – user2625768

+0

다행스럽게도이 주제는 아니지만 여러 개의 JetPlayer 인스턴스를 제작할 때 다음 반사 코드가 작동하는 것으로 보입니다. 해킹과 같은 반 느낌. 생성자 jetFactory = JetPlayer.class.getDeclaredConstructor(); jetFactory.setAccessible (true); JetPlayer multiJet = jetFactory.newInstance(); – user2625768

+0

작동해서는 안되는 이유는 없지만 ** 분명히 싱글 톤을위한 것이므로 두 개 이상을 사용하는 경우 백엔드 저장소의 동시성 가정을 깨뜨릴 수 있습니다. – Delyan

0

보십시오.

JNI (Java Native Interface)에서 기본 메소드는 해당 이름으로 특정 클래스에 링크됩니다.

귀하의 경우, 네이티브 라이브러리를 정의해야합니다. libfoo.so이고 Java_com_example_app_MainActivity_floor이라는 내 보낸 함수가 있습니다 (com.example.app는 패키지 이름 임). 그런 다음 System.loadLibrary("foo")을 통해 라이브러리를로드하면 해당 메소드 만 사용할 수 있습니다.

다른 원시 라이브러리 (해당 Java 클래스에서 Java Reflection과는 별도로)에서 함수를 호출하는 한 가지 방법은 C/C++에서 라이브러리를로드하고 함수를 (dlopen, dlsym 등을 통해) 래핑하는 것입니다.

내가하려는 일에 대해 더 많이 알지 못해서 나는 더 구체적 일 수 없습니다.

JNI를 여기 네이티브 개발에 대해 자세히 알아보기 : https://code.google.com/p/awesomeguy/wiki/JNITutorial (조금 오래된하지만 JNI 부분은 여전히 ​​유효)

+5

이것은 질문과는 전혀 관련이 없습니다. – Delyan

관련 문제