VisualStudio에서 Gradle을 사용하여 Native APK를 만듭니다.

소개



어제 「VisualStudio에서 Ant를 사용하여 Native APK를 만듭니다. 」라고 하는 기사를 올렸습니다.
흩어져 Gradle에서 잘 할 수 없다고 말했습니다만, 그 뒤 곧바로 잘 할 수 있었습니다.
어떻게 하면 Gralde에서 할 수 있는지, 원래 왜 잘못 되었는가를 정리해 가겠습니다.

개발 환경


  • OS : Windows 10
  • Visual Studio 2017 Professional

  • 프로젝트 준비



    ※1 이외는 Ant와 같은 순서입니다.

    1. Gradle 프로젝트 만들기



    "AndroidGradle"이라는 이름으로 프로젝트를 만들어갑니다.


    2. 공유 라이브러리용 프로젝트 만들기



    "Shared"라는 이름으로 프로젝트를 만들어갑니다.


    3. 공유 라이브러리를 Gradle 프로젝트에 연결





    이것으로 프로젝트 준비 완료.

    JNI로 뚫고 동작 확인



    ※Ant와 같은 순서입니다.

    AndroidGradle.java
    public class AndroidGradle extends Activity
    {
        static {
            System.loadLibrary("Shared");
        }
        native void NativeTest(int value);
    
        /** アクティビティが最初に作成されるときに呼び出されます。 */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
    
            /* TextView を作成して、そのテキストを "Hello world" に設定します */
            TextView  tv = new TextView(this);
            tv.setText("Hello World!");
            setContentView(tv);
    
            // 追記
            NativeTest(234);
        }
    }
    

    Shared.cpp
    extern "C" {
        // 追記
        JNIEXPORT void JNICALL Java_com_AndroidGradle_AndroidGradle_NativeTest(JNIEnv* env, jobject, jint value)
        {
            LOGI("test [%d]", value);
        }
    }
    

    동작 확인



    위를 추기하면 Android 단말과 PC를 연결하여 실행해 봅니다.


    무사히 Gradle의 프로젝트에서도 브레이크 포인트에서 멈췄습니다.

    왜 잘 작동하지 않았습니까?



    원인 1. Gradle 설정 변경시에는 「리빌드」가 아니라 「빌드」로 확인이 필요.



    예를 들어 Gradle 플러그인이나 Gradle 버전을 변경할 때 다시 빌드하면 실패합니다.
    다시 빌드 할 때 gradlew.bat clean이 항상 실패하는 것 같습니다.
    그 경우는 리빌드가 아니라 빌드를 해 주면 괜찮습니다.
    이 사실을 깨닫는데 상당히 시간이 걸렸고 몇 번이나 Gradle 프로젝트를 재작성하고 있었기 때문에 조사·실험에 상당히 시간이 걸렸습니다.

    원인 2. Gradle 프로젝트의 build.gradle.template에 NDK 설정을 작성했습니다.



    Shared 프로젝트를 만들지 않고 AndroidGradle 프로젝트의 build.gradle.template에 NDK를 설정했습니다.
    그래도 APK 생성은 가능했지만 런타임에 Debug 구성을 사용해도 "Cannot find or open the symbol file."라고 출력 창에 나와 버려 브레이크 포인트가 작동하지 않습니다.
    심볼 정보를 so 파일에 포함할 수 없습니다.
    포함하는 방법을 여러가지 조사했습니다만 몰랐기 때문에 단념했습니다.

    요약



    이제 이상적인 형태로 Windows와 Android의 앱 개발을 VisualStudio에 집약할 수 있었습니다.
    iOS 앱 개발도 VisualStudio에서 할 수 있다는 이야기를 들었다.
    이번에는 그쪽도 도전해 나가려고 생각합니다.

    좋은 웹페이지 즐겨찾기