Android中JNI的实现方式

2018-10-22  本文已影响0人  爬行的蜗牛_徐

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");

}

上一篇 下一篇

猜你喜欢

热点阅读