Android JNI之動態創建native

                                          Android JNI之動態創建native

1、環境配置

      1)確定android studio裏安裝了ndk,可以按照下面的圖查看。

 2)系統環境變量配置,根據自己電腦路徑配置

                            

                                       

2、動態創建native

    1)新建一個android studio工程,然後在gradle.properties裏增加如下語句。

     

   2)在MainActivity平級目錄下新建一java文件,內容如下:

package com.example.myjnidemotest2;

public class JniUtils {
    static{
        System.loadLibrary("native-lib");
    }
    public static native String getStringFromJni();
    public static native int getAddResultFromJni(int a, int b);
}

  3) 在main下面新建jni目錄

4)在jni目錄下新建三個文件,一個cpp文件,兩個mk文件。 cpp文件是實現具體功能的,是用C++實現的。

     cpp文件內容

#include <jni.h>
#include <stdio.h>
#include<android/log.h>
#include <stdlib.h>

using namespace std;
#ifdef __cplusplus
extern "C" {
#endif

static const char *className = "com/example/myjnidemotest2/JniUtils";

JNIEXPORT jstring JNICALL JniSay(JNIEnv *env, jobject obj) {
    return env->NewStringUTF("Hello From JNI!!!");
}

JNIEXPORT jint JNICALL addInJni(JNIEnv *env, jobject obj, jint a, jint b) {
    return a + b;
}

static JNINativeMethod gJni_Methods_table[] = {
        {"getStringFromJni", "()Ljava/lang/String;", (void*)JniSay},
        {"getAddResultFromJni", "(II)I", (void*)addInJni},
};

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
    JNIEnv* env = NULL;
    jint result = -1;
    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        return result;
    }

    jclass clazz = (env)->FindClass( className);
    if (clazz == NULL){
        return -1;
    }

    if ((env)->RegisterNatives(clazz, gJni_Methods_table, sizeof(gJni_Methods_table) / sizeof(gJni_Methods_table[0])) < 0)
    {
        return -1;
    }

    return JNI_VERSION_1_4;
}

#ifdef __cplusplus
}
#endif

    Android.mk文件內容

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := ImplementFuns.cpp
include $(BUILD_SHARED_LIBRARY)

    Application.mk文件內容

APP_ABI := all

5)在app的build.gradle裏增加如下內容

6)調用JNI接口,我是在MainActivity裏調用的。

package com.example.myjnidemotest2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

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

        Log.d("wujiang", "from jni str = " + JniUtils.getStringFromJni());
        Log.d("wujiang", "a + b = " + JniUtils.getAddResultFromJni(4, 9));
    }
}

7)編譯運行就ok了,我的運行結果

                                                      THE    END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章