Android Studio JNI开发

来源:互联网 发布:js中有多少循环 编辑:程序博客网 时间:2024/05/16 11:23

今天花了一天时间终于把JNI的配置弄清了,参考了好几个人的文章,有一个地方原作者漏掉了,转载加补充

准备工作:下载NDK。

简单的说,要用到C/C++,就要用NDK。直接百度搜索然后去官网下载就行,位置可以随便放。

 

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

不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity

public class myJNI {
  //加载so库
    static {
        System.loadLibrary("JniTest");
    }
  //native方法
    public static native String sayHello();
}

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

命令:

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

然后就能看到生成了一个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 __cplusplusextern "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 __cplusplusextern "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文件,不然会报错,我也不知道为什么。

5、配置NDK

打开Project的local.properties文件添加NDK路径
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
 ndk {            moduleName "JniTest"            ldLibs "log", "z", "m"            abiFilters "armeabi", "armeabi-v7a", "x86"        }

  

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

6、生成SO库

完成以上步骤之后,我们rebuild一下就可以生成so库了(rebuild在Android Studio的标题栏里先找到Build,下拉就可以看到Rebuild Project)

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

7、配置so库

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

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());    }}
复制代码


好了,到这里完工shift + F10运行一下吧

原创粉丝点击