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

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