Android에서 로컬 코드 사용

6313 단어 AndroidJava
OpenGLES에 대한 마지막 설명 했어, 이번엔 계속하고 싶어, 안드로이드가 C/C++ 코드를 사용할 수 있다는 걸 알고 살짝 돌았어.
OpenGL의 코드 C/C++가 압도적인 다수를 차지하기 때문에 "그 자산을 이용할 수 있다!"기대되지만 생각보다 사용법이 많이 어려워졌다.아직 다 파악하지는 못했지만 내가 이해하는 범위를 총결해 보겠다.
최신 안드로이드 스튜디오에는 정보가 많지 않아 상당히 많은 모색이 이뤄졌으니 잘못된 점이 있으면 지적해달라.

차리다


Android Studio2.준비


Android Studio2.2에서 새 프로젝트를 만들 때 C/C++를 사용하시겠습니까의 확인란을 먼저 ON으로 설정합니다.

디렉토리 구조 확인


새 프로젝트의 구성을 확인하다.왼쪽의 프로젝트 구조를 Android에서 Project로 변경하여 모든 파일을 확인합니다.
다음 서류가 있으면 됩니다.
  • app/CMakeList.txt
  • app/src/main/cpp/native-lib.cpp
  • 시험해 보다


    build로 보고 싶습니다. 화면에 Textview가 표시됩니다.
    MainActivity.자바에서 cpp/native-lib까지.나는 c의 코드가 호출되었다는 것을 안다.
    public class MainActivity extends AppCompatActivity {
    
        // native-lib.cはコンパイルでlibraryになるようで、それをここで読み込んでいます。
        // import みたいなものでしょうか。
        static {
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Example of a call to a native method
            TextView tv = (TextView) findViewById(R.id.sample_text);
            tv.setText(stringFromJNI());
        }
    
        /**
         * native-lib.cで実装した関数を定義しているようです。
         */
        public native String stringFromJNI();
    }
    

    native-lib.cpp 확인


    다음 코드를 기본적으로 기술하고 싶습니다.
    이 코드를 봤어요.
    패키지, 프로젝트 이름, 함수 이름은 밑줄로 연결된 것 같습니다.아마 이게 격식이겠지.
    이런 기술은 정의된 것 같다.되돌아오는 값도'jstring'의 형식이다.
    이것이 Android NDK인지 JNI(Java native interface) 유형인지 확인합니다.
    #include <jni.h>
    #include <string>
    
    extern "C" 
    jstring
    Java_com_test_opengl_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject /* this */) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
    

    테스트 함수를 정의해 보세요.


    먼저 extern "C"를 모두 다음 내용으로 수정합니다.
    extern "C" {
    
    // ここに関数をいれます。
    
    }
    
    테스트 함수를 적당히 설명하다.매개 변수는 매우 규정이 있기 때문에 같은 것을 넣어야 한다.
    extern "C" {
    
        // stringFromJNIの記述は省略
    
        void
        Java_quad_jp_opengl_MainActivity_sayHello(JNIEnv *env, jobject){
            std::cout << "Hello World" << std::endl;
        }
    }
    
    물론 MainActivity도 함수를 정의합니다.
    public native void sayHello();
    
    구축 후 특별한 오류가 없습니다.cout의 출력이 어디에서 확인할 수 있는지 모르겠습니다.orz
    우선, C 쪽에서 처리하는 방법을 알았기 때문에 이걸로 지난번 코드를 수정합니다.이따가 여기서 추기할게요.

    참조 정보


    Android NDK(공식 페이지 세부 설정 방법 있음)
    일부 번역된 페이지가 있는데 번역이 잘 안 돼서 혼란스러워요.
    프로젝트에 C/C++ 코드 추가

    좋은 웹페이지 즐겨찾기