1.定义一个Java类,定义native方法
package demo.android.com.demo1;
public class HiJNI {
public native String getJniString();
}
2.查看是否有这个class,看路径:
app/build/intermediates/classes/debug 或者release
点击run或者在terminal输入:gradlew assembleDebug或者gradlew assembleRelease
3.生成.h文件,先建立一个文件夹,如jni(新建文件夹,右击directory)
D:\dl\BACKUP\20180820backup\20180820backup\20180820\demo1\app>
javah -d ./src/main/jni -classpath ./build/intermediates/classes/debug demo.android.com.demo1.HiJNI
4.在jni路径下创建cpp文件
例如:helloJNI.cpp
#include <demo_android_com_demo1_HiJNI.h>
#include <stdio.h>
#include <string.h>
extern "C"
JNIEXPORT jstring JNICALL Java_demo_android_com_demo1_HiJNI_getJniString
(JNIEnv *env, jobject obj){
return env->NewStringUTF("hello world from jni xuixuyang");
}
5.创建Android.mk 和 Application.mk,放入和.h和.cpp文件路径
Android.mk
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloJNI
LOCAL_SRC_FILES := helloJNI.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk
ALL_ABI=armeabi armeabi-v7a
6.编译so库
Terminal切到jni目录下面,ndk-build
7.将生成的libs文件拷贝到app/libs下面
8.so加入,到build.gradle脚本下面
在android { 下加入
sourceSets{
main{
jniLibs.srcDirs("libs")
}
}
}
9.JAVA中调用C中的函数
System.loadLibrary("helloJNI");
HiJNI hiJNI =new HiJNI();
String mm = hiJNI.getJniString();
10.在C中调用java的代码
例如:helloJNI.cpp
#include <demo_android_com_demo1_HiJNI.h>
#include <stdio.h>
#include <string.h>
extern "C"
JNIEXPORT jstring JNICALL Java_demo_android_com_demo1_HiJNI_getJniString
(JNIEnv *env, jobject obj){
//通过反射获取到类 demo.android.com.demo1
jclass jclazz =
env->FindClass("demo/android/com/demo1/MainActivity");
//通过反射获取到方法
/**
* 第个参数:方法所在class
* 第个参数:方法名
* 第个参数:方法签名(javap -s class全类名(字节码的全类名))
*/
jmethodID jmethod = env->GetMethodID(jclazz,"show","()V");
jmethodID jmethod2 = env->GetMethodID(jclazz,"show2", "()V");
/** * 创建类实例 */
jobject jobject1 = env->AllocObject(jclazz);
//调用方法
/**
* 第个参数:调用此方法的实例
* 第个参数:jmethodID
*/
env->CallVoidMethod(jobject1,jmethod);
env->CallVoidMethod(jobject1,jmethod2);
return env->NewStringUTF("hello world from jni xuixuyang");
}