Androidで呼び出し.soライブラリの操作手順


参考:http://www.cnblogs.com/anyanran/archive/2010/11/22/ndk1.html http://www.cnblogs.com/sevenyuan/p/4202759.html 先輩がこんな詳細な記録をしてくれてありがとうございます。次は自分で先輩の記録に基づいて実現しました。1.Android SoTest Androidプロジェクトを作成し、パッケージ名:package come.ybs.android sotest
2.クラスjava類を作成し、JNITestというクラスはnative方法であり、c中の方法を呼び出すために、もちろんcライブラリはndkツールコマンドによって最後に生成されました。soファイルです。一言で簡単にnative方法をまとめますと、javaではないコードを呼び出すインターフェースです。
package com.ybs.androidsotest;

public class JNITest {
    // Native Method    java   java     
    //           
    public native int add(int x, int y);
}
3.Android SoTestプロジェクトのルートディレクトリはjniフォルダを作成し、cライブラリのコードを入れます。mylib.cという名前のファイルを作成します。ここでcはjniの中の文法に変わります。cの中のタイプとjniの中のタイプの対応関係については、jniの関連文書を参照してください。ここで注意しました。このadd方法はここに穴があります。Java_プロジェクトのパッケージ名(パッケージ名は各級の間に下線で区切られています)_メソッド名
#include 
#include 



JNIEXPORT jint JNICALL
Java_com_ybs_androidsotest_JNITest_add( JNIEnv* env,
                                                  jobject thiz,
                                                  jint x,
                                                  jint y )
{
    return x + y;
}
4.Android SoTestプロジェクトのルートディレクトリjniフォルダに入れた.cファイルを生成.hヘッダファイルにして実行命令を実行します。以下の命令はJNITest.javaをJNITest.hに生成し、生成したJNITest.hをjniフォルダに入れるという意味です。
//      linux   (      ,        ,   JNITest.java        .h  )
javac JNITest.java && javah JNITest 
// cmd  ,  :
javah -jni -classpath D:\android_workspace\AndroidSoTest\src -d D:\-jni com.ybs.androidsotest.JNITest
5.ここで生成したJNITest.hファイル(ここではこのファイルは命令生成であり、手書きではない)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class JNITest */

#ifndef _Included_JNITest
#define _Included_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNITest
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_JNITest_add
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif
6.Android SoTestプロジェクトのルートディレクトリjniフォルダにAndroid.mkファイルを作成します。Android.mkはmakefileで、NDKにどのファイルをコンパイルする必要がありますか?どのモジュールを生成しますか?LOCAL_PATHはcソースコードファイルの位置を表します。LOCAL_MODULEは生成した共有ライブラリの名称を表します。LOCAL_SRC_FILESはcコードのファイルを表します。頭を中に入れる必要はありません。ヘッダファイルの依存関係は自動的に計算されます。
LOCAL_PATH := $(call my-dir)



include $(CLEAR_VARS)

LOCAL_MODULE    := mylib
LOCAL_SRC_FILES := mylib.c

include $(BUILD_SHARED_LIBRARY)
7.Android SoTestプロジェクトのルートディレクトリの下でAppplication.mkファイルを作成し、Apple.mkの役割はAndroid SDKにはどのようなライブラリファイルが必要かを教えることです。それがあれば、NDKはライブラリを正しい位置に置くことができます。APP_.PROJECT_PATHはandroid工程所在目録を代表しており、本例では中に置かれている。APP_.MODULESは工事に必要なライブラリを表しています。複数あればスペースで分けます。
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES      := mylib
8.ここで作成します。soファイルはプロジェクトAndroid SoTestのルートディレクトリに入り、ndk-buildを実行すればいいです。(windows環境にndkを設置し、環境変数を配置します。ndkダウンロード先:https://developer.android.google.cn/ndk/downloads/index.html ダウンロード後の解凍は、システム環境変数PATHに環境変数と、ndk解圧後に配置されたディレクトリを配置すれば良いです。配置経路は参照できます。D:\androids\android-and roid-r 14 b-windows-x 86_64\android-ndk-r 14 b)コマンドは以下の通りです
cd AndroidSoTest
ndk-build
このときコマンド項目を実行したlibsフォルダには、armeabiフォルダが生成されます。このarmeabiフォルダにはmylib.soファイルが生成されます。プロジェクトのルートディレクトリの下では、objフォルダや関連コンテンツも生成されます。
9.ここではMainActivityでJNITestのメソッドを呼び出すことができます。コードは以下の通りです
package com.ybs.androidsotest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;


public class MainActivity extends Activity {

    private TextView textView;
    //       ,   so   ,     lib   .so  ,            
    static{
        System.loadLibrary("mylib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);
        //     JNITest    ,     。
        JNITest test=new JNITest();
         int x = test.add(3, 5);
         //   textView 。
         textView.setText("test.add(3, 5)=="+x+"");

    }

}