Android ndk/jni와 함께 C++ 사용
모든 ndk 샘플은 헤더에 extern으로 선언되고 cpp 파일에 정의된 기본 C 함수만 사용합니다.그러면 jni callback이 포함된 C 파일에 헤더 파일을 포함시킨 후에는 모든 것이 정상적으로 동작합니다.
안드로이드 ndk로 C++ 클래스를 사용할 수 있나요?제 애플리케이션은 네이티브 액티비티가 아니라 여전히 중요한 자바 부분을 가지고 있지만 CPU 집약적인 계산을 위해 네이티브 C 코드를 호출할 것입니다(클래스 및 기타 C++ 항목이 있는 C++로 이미 작성됨).
지금은 구조물과 같은 나의 헬로 월드를 소개합니다.
먼저 파일을 작성합니다.h"
#ifndef FIRST_H
#define FIRST_H
class Test
{};
#endif /* FIRST_H */
파일 "second.cpp"
#include <jni.h>
#include "first.h"
#ifdef __cplusplus
extern "C" {
#endif
jint Java_com_example_twolibs_TwoLibs_add( JNIEnv* env,
jobject this,
jint x,
jint y )
{
Test t;
return 0;
}
#ifdef __cplusplus
}
#endif
그리고 마지막으로 Android.mk .
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.cpp
include $(BUILD_SHARED_LIBRARY)
아주 기본적이지만 그것은 컴파일이 되지 않습니다..c 파일에서 second.cpp를 돌리면 헤더 파일을 포함할 때 오류가 발생하는데, 이는 C++ 파일이 아니기 때문인 것 같습니다.
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
.cpp로 만들면 다음 오류가 발생합니다.
make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'. Stop.
어떻게 하면 그걸 컴파일 할 수 있을까요?
감사해요.
NDK와 함께 C++를 사용할 수 있지만 C++ 코드가 있는 파일은 확장자가 .cpp여야 합니다.
ANDROID-MK.html에서:
C++ 소스 파일의 기본 확장자는 '.cpp'입니다.그러나 LOCAL_CPP_EXTENSION 변수를 정의하여 다른 변수를 지정할 수 있습니다.처음 점(즉, '.cxx'는 작동하지만 'cxx'는 작동하지 않음)을 잊지 마십시오.
Android 전용으로 모든 네이티브 라이브러리를 다시 컴파일해야 합니다.단순히 우리가 안드로이드 밖에서 이 라이브러리들을 컴파일하고 링크할 때 그것들이 연결되기 때문에 당신이 사용하려는 모든 서드파티 네이티브 라이브러리에 대한 소스 코드가 필요합니다.glibc
하지만 안타깝게도 안드로이드는 사용하지 않습니다.glibc
라이센스 및 성능 문제로 인해.Android는 Waterdown 버전을 사용합니다.glibc
불렀다libc
을 가지고 있습니다 대부분의 일반적인 기능에 대해 glibc와 일치하는 기호 이름을 가지고 있습니다.하지만 제가 알기로는 libc는 관련된 기능을 가지고 있지 않습니다.strings
그리고 그것은 확실히 몇 개가 있지 않습니다.posix
지지하다.기본 라이브러리에서 더 이상 사용되지 않는 기능을 사용하는 경우 다음과 같이 지원되는 대체 기능을 사용하여 해결 방법을 찾아야 합니다.libc
그에 따라 입술을 코딩하는 것.
또한 지적하신 대로 NDK를 사용하여 Java(Android app/fwk)를 네이티브 월드(C++)와 인터페이스해야 합니다.
Android(안드로이드 포팅)에서 네이티브 라이브러리를 컴파일하는 제 경험에는 이것이 꽤 단순하게 들리지만, 전통적으로 성공에 대한 보장 없이 매우 많은 시간이 소요되었습니다.
컴파일 오류와 관련하여 처음에 "second.c"라고 불렀다가 나중에 "second.cpp"로 이름을 바꾼 것 같지만 개체 파일에 "second.c" 이름이 남아 있기 때문에 컴파일(bdk-build)하기 전에 /cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/d 디렉토리에서 *.o 및 *.d 파일을 제거해야 합니다.
오류: 'class' 앞에 '=', ',', ';', 'asm' 또는 '__ 속성__'이 필요합니다.
class 키워드 앞에 ';'가 빠진 전형적인 경우?상상하다
int functionname(int p)
class X { } ;
이것은 당신의 컴파일러 메시지로 꽤 쉽게 이어질 수 있습니다.일반적인 복잡한 요인은 실제로 다음과 같이 보이는 경우입니다.
#include "someheader.h"
class X { } ;
오류가 someheader 내부의 마지막 선언에 있습니다.h /또는 재귀적으로 포함된 파일/ ;)
실행:
ndk-build clean
네가 잘못을 고친 후에Android.mk
, 그렇지 않으면 구성을 수정했더라도 빌드가 계속 실패할 수 있습니다.
이것이 OP가 이 댓글에 의미한 것이라고 생각합니다.
Android.mk 편집
LOCAL_SRC_FILES의 인스턴스를 수정하고 각 행의 처음에서 ./를 제거합니다.
언급URL : https://stackoverflow.com/questions/6423078/use-c-with-android-ndk-jni
'programing' 카테고리의 다른 글
Adding a conditional to mustache/php (0) | 2023.10.31 |
---|---|
TensorFlow에서 tf.app.flags의 목적은 무엇입니까? (0) | 2023.10.31 |
코디네이터 레이아웃의 도구 모음 아래에 보기 추가 (0) | 2023.10.31 |
LocalStorage에서 부울 값을 설정할 수 없습니까? (0) | 2023.10.31 |
ID에 대괄호가 포함된 경우 ID로 DOM 요소를 찾으십니까? (0) | 2023.10.26 |