Android Studio JNIが使用する個人ノート
8757 ワード
JNIデータ型
JNIは独自のデータ型を定義しています.これらのデータ型はJava層とC/C++層をつなぐものであり,一つのオブジェクトが渡されるとC/C++にはこのオブジェクトを識別することはできないし,同様にC/C++のポインタがJava層にとっても識別できない場合はJNIがマッチングする必要があるので,独自のデータ型を定義する必要がある.
1.元のデータ型
Java Type
Native Typ
Description
boolean
jboolean
unsigned 8 bits
byte
jbyte
signed 8 bits
char
jchar
unsigned 16 bits
short
jshort
signed 16 bits
int
jint
signed 32 bits
long
jlong
signed 64 bits
float
jfloat
32 bits
double
jdouble
64 bits
void
void
N/A
2.参照タイプ
前にAndroid Jniオブジェクトを取得する際にjclass参照を定義し、FindClass関数を呼び出してそのオブジェクトを取得したので、JNIはJNIレイヤ呼び出しのためにいくつかの参照タイプを定義しました.具体的な参照タイプは以下の通りです.
3.メソッドと変数のID Javaのメソッドを呼び出す必要がある場合、まずそのIDを取得し、IDに基づいてJNI関数を呼び出してメソッドを取得し、変数の取得プロセスも同様のプロセスであり、これらのIDの構造体は以下のように定義される.
Android StduioにおけるJNIアプリケーション
新しいJniUtilsクラス実装nativeメソッド
次にclean projectがrebuild projectでclassファイルを生成し、
Terminal入力コマンド
この时src/main/jniの下で.hファイルを生成して、新しいcクラスを作って胜手に名前を取って、コードを追加します
/* * Class: Java_com_dongdong_ndkjnidemo_JniUtils * Method: getStringFormC * Signature: ()Ljava/lang/String; */
JNIEXPORT jstring JNICALL Java_com_dongdong_ndkjnidemo_JniUtils_getStringFormC (JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,
「ここはcからのstringです」).
ここでヘッダファイル
設定が終わったら、ヘッダーファイルがまだ赤いことに気づいて、それからbuildで工事をして、ヒントがあります.
Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true"in gradle.properties to continue using the current NDK integration.
ヒントを押せばいいgradle.propertiesファイルの末尾に
ここまで来て改めてビルドアイテムを作ってみると、もう赤くなっていません.次に運用して、JniUtilsクラスに次のコードを追加します
そして簡単に呼び出せばいいのですが、MainActivityコードは次の通りです.
app->intermediates-ndk-debugを開くと、3つのフォルダが生成され、build.gradleで構成されていたabiFiltersに対応しています.
Eclipseではcdプロジェクトディレクトリjavah-d jni-classpath bin/classes com.dongdong.utils.MainActvity生成.hファイルが必要です..cファイルを作成して関連コードを実装します..mkファイルを変更します.
LOCAL_MODULE := ApkPatchLibrary //ライブラリ名Android.mkファイルLOCAL_SRC_FILES := com_dongdong_utils_MainActvity.c CファイルLOCAL_LDLIBS := -lz -llog //Androidログ構成
Application.mkAPP_ABI:=armeabi armeabi-v7a arm64-v8a //コンパイルされたプラットフォーム
最後にcdプロジェクトディレクトリでndk-buildコマンドを実行すればよい.
JNIは独自のデータ型を定義しています.これらのデータ型はJava層とC/C++層をつなぐものであり,一つのオブジェクトが渡されるとC/C++にはこのオブジェクトを識別することはできないし,同様にC/C++のポインタがJava層にとっても識別できない場合はJNIがマッチングする必要があるので,独自のデータ型を定義する必要がある.
1.元のデータ型
Java Type
Native Typ
Description
boolean
jboolean
unsigned 8 bits
byte
jbyte
signed 8 bits
char
jchar
unsigned 16 bits
short
jshort
signed 16 bits
int
jint
signed 32 bits
long
jlong
signed 64 bits
float
jfloat
32 bits
double
jdouble
64 bits
void
void
N/A
2.参照タイプ
前にAndroid Jniオブジェクトを取得する際にjclass参照を定義し、FindClass関数を呼び出してそのオブジェクトを取得したので、JNIはJNIレイヤ呼び出しのためにいくつかの参照タイプを定義しました.具体的な参照タイプは以下の通りです.
jobject (all Java objects)
|
|-- jclass (java.lang.Class objects)
|-- jstring (java.lang.String objects)
|-- jarray (array)
| |--jobjectArray (object arrays)
| |--jbooleanArray (boolean arrays)
| |--jbyteArray (byte arrays)
| |--jcharArray (char arrays)
| |--jshortArray (short arrays)
| |--jintArray (int arrays)
| |--jlongArray (long arrays)
| |--jfloatArray (float arrays)
| |--jdoubleArray (double arrays)
|
|--jthrowable
3.メソッドと変数のID Javaのメソッドを呼び出す必要がある場合、まずそのIDを取得し、IDに基づいてJNI関数を呼び出してメソッドを取得し、変数の取得プロセスも同様のプロセスであり、これらのIDの構造体は以下のように定義される.
struct _jfieldID; /* opaque structure */
typedef struct _jfieldID *jfieldID; /* field IDs */
struct _jmethodID; /* opaque structure */
typedef struct _jmethodID *jmethodID; /* method IDs */
Android StduioにおけるJNIアプリケーション
新しいJniUtilsクラス実装nativeメソッド
public class JniUtils {
public static native String getStringFormC();
}
次にclean projectがrebuild projectでclassファイルを生成し、
Terminal入力コマンド
cd app\src\main
を再度開いてから、コマンドjavah -d jni -classpath ..\..\build\intermediates\classes\debugcom.dongdong.ndkjnidemo.JniUtils
を入力します.この时src/main/jniの下で.hファイルを生成して、新しいcクラスを作って胜手に名前を取って、コードを追加します
#include "stdio.h"
#include "stdlib.h"
#include "com_dongdong_ndkjnidemo_JniUtils.h"
/* * Class: Java_com_dongdong_ndkjnidemo_JniUtils * Method: getStringFormC * Signature: ()Ljava/lang/String; */
JNIEXPORT jstring JNICALL Java_com_dongdong_ndkjnidemo_JniUtils_getStringFormC (JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,
「ここはcからのstringです」).
ここでヘッダファイル
#include
が赤くなったのは、ndk環境がまだ構成されていないためです.file->project structureを開いてダウンロードしたndk環境パスを選択します.設定が終わったら、ヘッダーファイルがまだ赤いことに気づいて、それからbuildで工事をして、ヒントがあります.
Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true"in gradle.properties to continue using the current NDK integration.
ヒントを押せばいいgradle.propertiesファイルの末尾に
android.useDeprecatedNdk=true
を追加すればOKです.appファイルの下にbuild.gradle->defaultConfigカッコに次のコードを追加します.ndk {
moduleName "Lib"
ldLibs "log"
abiFilters "armeabi", "armeabi-v7a"
}// abi so , 。
ここまで来て改めてビルドアイテムを作ってみると、もう赤くなっていません.次に運用して、JniUtilsクラスに次のコードを追加します
static {
System.loadLibrary("NdkJniDemo");// build.gradle so ,
}
そして簡単に呼び出せばいいのですが、MainActivityコードは次の通りです.
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.ndk_text);
textView.setText(JniUtils.getStringFormC());
}
}
app->intermediates-ndk-debugを開くと、3つのフォルダが生成され、build.gradleで構成されていたabiFiltersに対応しています.
Eclipseではcdプロジェクトディレクトリjavah-d jni-classpath bin/classes com.dongdong.utils.MainActvity生成.hファイルが必要です..cファイルを作成して関連コードを実装します..mkファイルを変更します.
LOCAL_MODULE := ApkPatchLibrary //ライブラリ名Android.mkファイルLOCAL_SRC_FILES := com_dongdong_utils_MainActvity.c CファイルLOCAL_LDLIBS := -lz -llog //Androidログ構成
Application.mkAPP_ABI:=armeabi armeabi-v7a arm64-v8a //コンパイルされたプラットフォーム
最後にcdプロジェクトディレクトリでndk-buildコマンドを実行すればよい.