美文网首页
Android Studio使用JNI实例

Android Studio使用JNI实例

作者: chjxidian | 来源:发表于2020-03-15 10:26 被阅读0次

1、新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。

  • 不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity 、 android.os.Context …如果实在避免不了使用Android原生类,可以使用Object代替。
public class myJNI {
//加载so库
static {
System.loadLibrary("JniTest");
}
//native方法
public static native String sayHello();
}

2、打开android studio终端,使用javac编译上述文件,生成class文件。

image.png

命令:

D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni>javac myJNI.java

3、确认自己类的包名!然后在上一级的位置使用javah生成.h头文件

一定要在上一级,不然不会报错:找不到xxx类

比如我的myJNI.class在

D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni

我的包名是:

package com.example.binbin.testjni;

所以我的javah命令应该这么写:

D:\AndroidStudioProject\testJNI\app\src\main\java>javah -jni com.example.binbin.testjni.myJNI

image.png

然后就能看到生成了一个h文件。

4、新建一个jni文件夹,新建main.c,把.h里面的内容复制进去,并实现里面的函数。

生成的h文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_binbin_testjni_myJNI */
#ifndef _Included_com_example_binbin_testjni_myJNI
#define _Included_com_example_binbin_testjni_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 Class:     com_example_binbin_testjni_myJNI
 Method:    sayHello
 Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello
        (JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif

拷贝修改后的main.c

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_binbin_testjni_myJNI */
#ifndef _Included_com_example_binbin_testjni_myJNI
#define _Included_com_example_binbin_testjni_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_binbin_testjni_myJNI
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
//就实现了个函数 JNIEnv的用法可以自行百度,这里就不展开了
JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello
        (JNIEnv *env, jclass jobj){
//返回一句话
    return (*env)->NewStringUTF(env,"JNI hahahahahahahaha");
}
#ifdef __cplusplus
}
#endif
#endif

还要在jni文件夹下添加一个空白的util.c文件,不然会报错,我也不知道为什么。

image.png

5、配置NDK

打开Project的local.properties文件添加NDK路径

image.png

打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码

注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名

ndk {
            moduleName "JniTest"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
image.png

还要在gradle.properties里面加上这么一句话:

android.useDeprecatedNdk=true

image.png

6、生成SO库

完成以上步骤之后,我们rebuild一下就可以生成so库了

在项目的app\build\intermediates\ndk\debug\lib路径下

image.png

7、配置so库

在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下

image.png

8、使用JNI

因为native方法声明成了静态的方法,在Activity里面直接调用myJNI类就行

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  text = (TextView)findViewById(R.id.text);
  //调用
  text.setText(myJNI.sayHello());
  }
}
image.png

总结一下流程:

  • 编写静态方法(用java声明)-->编译生成class文件--->编译生成h文件---->编写C文件(用C/C++实现)

---->配置NDK---->配置so库---->在Activity调用(Java调用C/C++)

相关文章

网友评论

      本文标题:Android Studio使用JNI实例

      本文链接:https://www.haomeiwen.com/subject/txmfehtx.html