programing

Android ndk/jni와 함께 C++ 사용

lovejava 2023. 10. 31. 20:13

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