这里完成一个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();