2012-07-06 2 views
1

GSL (GNU Scientific Library)을 사용하는 Android 애플리케이션을 작성하려고합니다. 특히 BLAS 구현을 위해 'libgslcblas.so'에 관심이 있습니다. Android NDK를 활용하고 라이브러리를로드하고 적절한 함수 호출을 수행하는 Java 프로그램을 작성하기로 결정했습니다.Android NDK 기본 함수 호출 문제

어떻게 작동하는지 테스트하려면 'libm.so'를로드하고 임의의 함수를 호출하는 간단한 프로그램을 작성하려고했습니다. 이것은 내가 생각할 수있는대로 NDK의 사소한 유스 케이스에 대해 보였다, 그러나 나는 다음과 같은 문제로 실행 :

다음과
07-05 18:11:07.264: I/System.out(1298): debugger has settled (1464) 
07-05 18:11:07.583: D/dalvikvm(1298): No JNI_OnLoad found in /system/lib/libm.so 0x41345988, skipping init 
07-05 18:11:07.903: W/dalvikvm(1298): No implementation found for native Lissm/libctest/LibCtest;.sqrt (D)D 

내 코드가 같이

package issm.libctest; 

import android.os.Bundle; 
import android.app.Activity; 
import android.widget.TextView; 

public class LibCtest extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     TextView tv = new TextView(this); 
     setContentView(R.layout.activity_lib_ctest); 

     double x = sqrt(4); 

     tv.setText("Sine of: " + x); 
     setContentView(tv); 
    } 

    public native double sqrt(double x); 

    static 
    { 
     System.load("/system/lib/libm.so"); 
    } 
} 

정말하지 않습니다 문제를 이해하십시오. 앞에서 말했듯이 이것은 내가 생각할 수있는 NDK의 가장 간단한 사용법입니다. 다른 사람이이 문제를 해결하도록 도와 줄 수 있습니까?

감사합니다.

+0

[JNI] (http://developer.android.com/guide/practices/jni.html)를 사용하여 NDK로 다시 컴파일 한 원시 함수를 호출 할 수 있습니다. –

+0

@KeithFlower 해당 라이브러리에 대한 참조가 없습니다 ... – t0mm13b

+2

예. GSL에서 함수를 호출한다고 생각했던 글로벌 목표에 대해 이야기하고 있습니다. libm.so를 사용한 테스트 (작동하지 않을 것입니다)가 아닙니다. –

답변

5

JNI에 대한 내용을 읽으십시오. 즉, 임의의 전역 C 함수는 Java에서 NDK를 통해 호출 할 수 없습니다. 호출 될하기 위해, 함수의 라인을 따라, 매우 구체적인 서명이 필요합니다 :

native void MyMethod(int arg1); 

: 자바 측면에서

void Java_com_mypackage_MyClass_MyMethod(JNIEnv *jni, jobject thiz, jint arg1); 

, 그 패키지 com.mypackage에서 클래스 MyClass의 방법이 될 것입니다 Obviosly, 바닐라 sqrt은 청구서에 맞지 않습니다. 따라서 Java에서 호출하려는 모든 함수에 대해 Java 친화적 인 래퍼를 제공해야합니다. 이를 염두에두고, 단순한 수학 프리미티브와 같은 상위 개념의 래퍼를 제공하고 싶을 것입니다. Java/C 경계는 지저분합니다. 그것을 교차 시키면할수록 좋습니다.

또한 라이브러리는 Android 용 소스에서 빌드해야합니다. NDK에는이를위한 도구가 있습니다. 다른 플랫폼 (예 : Linux 또는 Windows) 용 기성품 바이너리는 사용할 수 없습니다.

편집 : javah 툴은 JDK에서 선언을 사용하여 자바 클래스를 가져 와서 더미 구현을 사용하여 스켈레톤 H/C 파일을 만들 수 있습니다. 본질적으로 JNI 규칙을 따라 메소드 프로토 타입을 Java에서 C로 변환합니다.

+2

"Java/C 경계선이 더러워지면 교차하지 않을수록 좋습니다." 아멘. –

+0

위대한 의견이지만 C의 함수 선언에서 "extern"이 암시 적이라는 인상을 받았습니다 ... 내가 잘못 했습니까? OH! 나는 그 함수 이름이 ... .... 필요하다는 것을 깨닫지 못했다. :( – Daeden

+0

'extern'은 암시 적입니다. 복사 - 붙여 넣기를하고있었습니다 :) –

0

사용하려는 라이브러리 (및 종속성)가 대상 플랫폼 (Android 네이티브 플랫폼) 용으로 제작되었는지 확인하십시오.

+0

내가 downvoted 이유는 logcat의 단서에 - "libm"이 표준 C 라이브러리에 링크되어있는 "/system/lib/libc.so에있는 JNI_OnLoad가 없습니다"입니다. – t0mm13b

+1

@ t0mm13b 투표하기 전에 질문하는 것이 좋습니다. – Tatvamasi