JNIコンパイルso

5335 ワード

JNI
原文アドレス:超シンプルなAndroid Studio jni実装(コマンドライン不要)
1、生成する.hファイル
Program: JDKPath J D K P a t h\bin\javah.exe Parameters:-classpath . -jni -d ModuleFileDir M o d u l e F i l e D i r\src\main\jni FileClass F i l e C l a s s Working directory: ModuleFileDir M o d u l e F i l e D i r\src\main\Java
コメント:
-classpath classesはクラスの位置を示す-jni com.jni.jnitest.JNITestクラスの絶対パス-dが生成する.hファイルを指定ディレクトリの下に置く.
クラスを書いてJNIインタフェースを呼び出す
public class JNITest {
    static {
        System.loadLibrary("JniLib");
    }
    public native String getString();
}

右クリックで書かれたクラス、右クリックsrc->New->Folder->JNI Folder
jniフォルダの下に生成されます.hフォルダ.
2、ファイルJniLibの作成cpp 、Android.mk、Application.mk
まず、jniフォルダの作成
右クリックsrc->New->Folder->JNI Folder
次に、jniディレクトリの下でJniLib.cpp、Android.mk、Application.mkの3つのファイルをそれぞれ作成して作成します.
  • JniLib.cppレプリケーションは作成したばかりです.hファイル内容はJniLib.cppに変更され、以下の通り(このファイルはJNIコンテンツファイル):
  •    /* DO NOT EDIT THIS FILE - it is machine generated */
       #include 
       /* Header for class com_jni_jnitest_JNITest */
       /*
       * Class: com_jni_jnitest_JNITest
       * Method: getString
       * Signature: ()Ljava/lang/String;
       */
       JNIEXPORT jstring JNICALL
        Java_com_ynh_mediaclient_mediaclient_JNITest_getString //     
       (JNIEnv * env, jobject jobject)
       {
       return (*env).NewStringUTF("    JNI  ");
       }
  • Android.mk
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := JniLib
    LOCAL_SRC_FILES =: JniLib.cpp
    include $(BUILD_SHARED_LIBRARY)
  • Application.mk
    APP_MODULES := JniLib //   so    -       so
    APP_ABI := all   //       so.

  • 合計4ファイル
    3.その他の構成
    1.appの下のbuildを修正する.gradleファイル、次のように
    ndk{
    moduleName "JniLib"
    // abiFilters "armeabi", "armeabi-v7a", "x86" //       abi    so 
    }
    sourceSets.main{
    jni.srcDirs = []
    jniLibs.srcDir "src/main/libs"
    }

    2.プロジェクト下のgradle.propertiesファイル(このファイルがない場合は、自分で新規作成)にコードを追加します.
    android.useDeprecatedNdk=true

    4、ndk-buildの実行
    最初のステップと同じ条件で、構成されたツールで実行されます.
    JNIクラスの右ボタン->New->External Tools->ndk-buildを選択すると、成功します.
    5、呼び出しso
    クラステストを書いてください.
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
        Button button;
        TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            button=(Button) findViewById(R.id.button);
            tv=(TextView) findViewById(R.id.tv);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    tv.setText("  :"+ new JNITest().getString());
                }
            });
        }
    }
    }

    効果図: