2012-10-10 3 views
1

어떤 사람이 도와주세요.여러 C++ 파일을 사용하여 ndk를 빌드하는 방법

나는 간단한 응용 프로그램에서 작업하고 있습니다. ndk를 사용하여 android에서 factorial을합니다.

두 개의 .cpp 파일을 갖고 싶습니다. 하나는 계계 클래스이며 다른 하나는 그 클래스의 메서드를 호출하는 주 도구입니다. 빌드 할 때 헤더 문제를 처리하는 방법을 모르겠습니다. 제발 도와주세요.

#include "com_lan_factorial_FacLib.h" 

JNIEXPORT jlong JNICALL Java_com_lan_factorial_FacLib_fac 
    (JNIEnv *env, jclass clazz, jlong n) 

{ 


    jlong result = (jLong) (fac(n)); 

    return result; 
} 

이 코드는 fac 메소드를 호출합니다. 이것은 Main.cpp입니다.

#include <stdio> 
#include "com_lan_factorial_FacLib.h" 

long fac(long n) 
    { 
     long f = 1; 
     long i; 
     for(i = 1; i <= n; i++) 
     { 
      f *= i; 
     } 
     return f; 
    } 
} 

이 클래스는 fac 메소드를 만듭니다. 확인

C:\Users\Lan\workspace\Factorial>..\..\temp\android\android-ndk-r8b\ndk-build 
"Compile++ thumb : FacLib <= Main.cpp 
jni/Main.cpp: In function 'jlong Java_com_lan_factorial_FacLib_fac(JNIEnv*, jclass, jlong)': 
jni/Main.cpp:7:30: error: 'fac' was not declared in this scope 
make: *** [obj/local/armeabi/objs/FacLib/Main.o] Error 1 

임 아닌 두 번째 파일은 정말 com_lan_factorial_fac.cpp.callMain라고 FAC가

답변

3

을 선언되지 않는 이유 :이 fac.cpp

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_CFLAGS := -Wno-psabi 
LOCAL_MODULE := libfac 
LOCAL_SRC_FILES := fac.cpp 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
include $(BUILD_STATIC_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_CFLAGS := -Wno-psabi 
LOCAL_MODULE := FacLib 
LOCAL_SRC_FILES := Main.cpp 
LOCAL_STATIC_LIBRARIES := libfac 
include $(BUILD_SHARED_LIBRARY) 

컴파일 로그는 무엇입니까? 문제는 해당 확장자가 .cpp이 아니란 것입니다. 확장자는 callMain입니다. .cpp로 끝나는 뭔가 이름 바꾸기, 모두 파일 이름 목록에 Anrdoid.mk 편집 :

LOCAL_SRC_FILES := com_lan_factorial_callMain.cpp some_other_file_name.cpp 

당신은 한 줄에 모든 파일을 나열 할 수 있습니다, 또는 당신이이처럼 분할 할 수 있습니다

LOCAL_SRC_FILES := com_lan_factorial_callMain.cpp \ 
    some_other_file_name.cpp 

다른 오류 메시지는 com_lan_factorial_fac.h 파일을 찾을 수 없다는 것입니다. 그런 파일이 존재합니까?

EDIT : Android.mk가 잘못되었습니다. 두 개의 소스 파일에서 하나를 빌드하는 두 개의 라이브러리를 빌드하지 않습니다. 그것은 다음과 같이 가야한다 :

extern long fac(long n); 

귀하의 컴파일 오류 :

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_CFLAGS := -Wno-psabi 

LOCAL_MODULE := libfac 

LOCAL_SRC_FILES := fac.cpp Main.cpp 

include $(BUILD_STATIC_LIBRARY) 

그리고 당신하여 Main.cpp에

, 당신은 함수가 fac()가의 #include 라인과 Java_com_lan_factorial_FacLib_fac 기능 사이에 존재라는 것을 선언한다 메시지는이 줄의 부족과 관련이 있습니다.

일반적으로 LOCAL_C_INCLUDES 행은 필요하지 않습니다.

그런데 Android JNI에서 정의한 내장 C 데이터 유형 longjlong은 동일하지 않습니다. fac()jlong 님과 함께 사용하도록 수정하십시오.

+0

조금만 고쳤습니다. 이제는 단 하나의 오류가 있습니다. 다시 게시 할 수 있습니다. 좀 봐 주셔서 감사합니다 –

+0

나는 그것이 내 Android.mk와 관련이 있다고 생각합니다. @ Local_C_Inlcudes 라인, 내가 이것을 원할 지 모르겠다. 내가해야 할 일을한다면? –

관련 문제