android studio jni开发的第一个范例

jni开发主要应用是java调用c/c++对底层进行的一些操作,建议对这部分东西不了解的童鞋可以去看一看《java核心技术2》中的最后一章“本地方法”(非打广告,只是最近在看这本书的时候看到了这部分,各位看官知道其它更好的资料的欢迎推荐)里面有一些基础的描述,或许有助你更好的了解这部分内容,下面进行的步骤,可能忽略了一些基础的知识,如有不懂的地方,可以提出来大家一起分析。

  1. 首先在android studio新建一个工程SptUsrC.
  2. 在main/java/com.tek.spt.sptusrc目录下新建一个UtilJni.java文件,文件内容如下,请注意,这个文件中的“getHelloString()”会一直保持红色,不影响进行下面的操作:
public class UtilJni {
    public native String getHelloString();
}

同时我们需要修改一下MainActivity.java这个文件,以便更好的展示代码执行的效果(activity_main.xml中需要增加一个R.id.test的对象,请各位看官自行添加,谢谢):

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) this.findViewById(R.id.test);

        UtilJni jni = new UtilJni();

        mTextView.setText(jni.getHelloString());
    }
  1. 编译这个工程,使用菜单“build —>make project”,执行该步骤的目的是为了在”build/intermediates/classes/debug/com/tek/spt/sptusrc/”目录下生成UtilJni.class文件,其实这一步就是我们通常在教材中使用
    的”javac UtilJni.java”的作用是一样的,目的都是为了生成UtilJni.class文件。
  2. 点击AS的Terminal标签 ,进入到“build/intermediates/classes/debug”这个目录下,执行“javah com.tek.spt.sptusrc.UtilJni ”,生成文件com_tek_spt_sptusrc_UtilJni.h.针对这个指令,我们有必要说明一下,在普通的java教程里我们看到的应该是“javah UtilJni”这样的写法,但是在android studio里面不能这样直接,“javah com.tek.spt.sptusrc.UtilJni”这个的结构是这样的“javah 包名.类名 ”,请注意,一定要在“build/intermediates/classes/debug”这个目录下才是有效的,否则,就需要再修改一下javah 这个指令,在前面需要加上路径,在debug这个目录下是和我们java教程上的吻合的写法,这个是最基本的方法,其它方法的话暂时不推荐,因为有一个循序渐渐的过程。
  3. 在main目录下新建jni目录,把我们刚才生成的com_tek_spt_sptusrc_UtilJni.h文件拷贝到该目录下。
  4. 在jni目录下新建c文件UtilJniC.c,写入的内容主要有,请注意,UtilJniC.c中要写的函数,就是com_tek_spt_sptusrc_UtilJni.h中定义的JNIEXPORT jstring JNICALL Java_com_tek_spt_sptusrc_UtilJni_getHelloString(JNIEnv *env, jobject cl),这是从.h文件中拷贝的,请各位一定不要自己去写这个函数名,一定是用拷贝的方式粘贴过来,避免很多不必要的可能出现的问题。
    a. #include “com_tek_spt_sptusrc_UtilJni.h”
    b. JNIEXPORT jstring JNICALL Java_com_tek_spt_sptusrc_UtilJni_getHelloString(JNIEnv *env, jobject cl)

7.请检查你的ndk和sdk是否配置好,编译过程中,如果ndk的版本差异可能导致很多不一样的问题, 所以如果根据上面的编译过程中出现问题,请一定检查你的ndk的版本,如果你无法排查出其它问题,可以换一个ndk版本进行编译,这一点非常重要,一定要引起重视。

8.在app module目录下的build.gradle中设置库文件名(生成的so文件名),

ndk{
            moduleName "SptBlood"         //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无。
        }
  1. 最后一步,回过头来在UtilJni.java文件加入下面的语句
static {
        System.loadLibrary("YanboberJniLibName");   //defaultConfig.ndk.moduleName
    }

最后的UtilJni.java文件的内容如下所示:

public class UtilJni {

    static {
        System.loadLibrary("SptBlood");   //defaultConfig.ndk.moduleName
    }

    public native String getHelloString();
}
  1. 还要在gradle.properties里面加上这么一句话:
    android.useDeprecatedNdk=true
    这句话请一定要加上,当ndk不匹配的时候会造成
    “Error: Your project contains C++ FILES BUT IS NOT USING A SUPPORTED NATIVE BUILD SYSTEM.”这样的报错,所以最保险的方法是,不管你的idk是什么版本,请一定要加上这句话。

  2. 最后一步就是编译运行apk了。最后再说一句, 如果你没有编译成功,可以考虑换一个ndk版本,首先一定要保证ndk版本的正常,否则会出现很多小问题, 浪费你宝贵的时间。

猜你喜欢

转载自blog.csdn.net/lz99770337/article/details/78685118