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ではないコードを呼び出すインターフェースです。
9.ここではMainActivityでJNITestのメソッドを呼び出すことができます。コードは以下の通りです
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+"");
}
}