Android Studio JNIが使用する個人ノート


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レイヤ呼び出しのためにいくつかの参照タイプを定義しました.具体的な参照タイプは以下の通りです.
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コマンドを実行すればよい.