Android Studio3.0: Hello JNI

这里完成一个C++ 调用 Java 代码的栗子。

1.Java加载和声明调用的方法

package com.example.gch.jnitest01;

import android.util.Log;

public class Myjni {
    /**
     * native调用Java的方法
     */
    public static void nativeToJava() {
        Log.e("nativeToJava", "Success");
    }

    static {
        System.loadLibrary("Myjni");
    }

    /**
     * Java调用native的方法
     */
    public native String getStringByJni();
}


2.生成.h 文件
Build -> Make Project 生成Myjni.class
这个使用javah命令,定位到Myjni.class 包所在的路径
可以
如果这个路径不确定,可以到项目所在的路径下面进行搜索。
控制台定位到编译生成的Myjni.class 所属package所在的路径(这里是D:\Jnitest01\app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes)
使用
javah com.example.gch.jnitest01.Myjni
这样在当前路径下生成了com_example_gch_jnitest01_Myjni.h文件
PS.如果Myjni.java中使用了Context等Android类库,可以将
D:\Android7.0_SDK_20161128\Android7.0_SDK_20161128\sdk\platforms\android-28\android.jar加入classpath环境变量。
将生成的com_example_gch_jnitest01_Myjni.h copy 到app/src/main/jni/

3.完成Myjni.cpp
在jni目录下新建Myjni.cpp,将下面的内容放入该文件

#include "com_example_gch_jnitest01_Myjni.h"
#include <android/log.h>

#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)


/*
 * Class:     com_example_gch_jnitest01_Myjni
 * Method:    getStringByJni
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_gch_jnitest01_Myjni_getStringByJni
        (JNIEnv *env, jobject jObj) {
    //在Java层调用该方法的时候,nativie去调用Java中的方法
    jclass jclass1 = env->FindClass("com/example/gch/jnitest01/Myjni");
    jmethodID jmethodID1 = env->GetStaticMethodID(jclass1, "nativeToJava", "()V");
    env->CallStaticVoidMethod(jclass1, jmethodID1);
    LOGE("log string from ndk.");
    return env->NewStringUTF("HelloFrom JNI!");

}


4.Android.mk
在jni目录下新建Android.mk,将下面的内容放入该文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CPP_EXTENSION := cpp
LOCAL_MODULE := Myjni
 LOCAL_SRC_FILES := Myjni.cpp
 LOCAL_LDLIBS := -llog
 include $(BUILD_SHARED_LIBRARY)

5.Application.mk
在jni目录下新建Application.mk,将下面的内容放入该文件

APP_ABI := all

6.app/build.gradle 完成 jni编译
在build.gradle文件添加ndk 、externalNativeBuild 标签

        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk{
            moduleName "Myjni"
            abiFilters "armeabi","armeabi-v7a"
        }
    }
    externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk"
        }
    }

7.在MainActivity.java中调用一下getStringByJni方法

                String msg = jni.getStringByJni();
                Toast.makeText(this, msg, Toast.LENGTH_LONG).show();

https://gitee.com/guchuanhang/HelloJni

猜你喜欢

转载自blog.csdn.net/guchuanhang/article/details/88037539