Android Studio 3.0 JNI的实现

当前环境: 
android studio 3.0.0 

android-ndk版本:


1、创建android项目 (JNIDemo)

2、创建jni文件夹

右键 src->New->Folder->JNI Folder 如图:



结果如图:


3、创建JNI类

public class JNITest {

    static {
        System.loadLibrary("JniLib");
    }

    public native String getString();

}

如图:

3.1生成.h文件

3.1.1方法一

配置 Anroid Studio 外部工具,一劳永逸,往后无需命令行,File->Setting->Tools->External Tools->“+”进入页面



Program:$JDKPath$\bin\javah.exe

Parameters:-classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$

Working directory:$ModuleFileDir$\src\main\Java

注释:

-classpath classes 指明类所在的位置

-jni com.jni.jnitest.JNITest 类的绝对路径

-d 产生的.h文件放到指定目录下;

配置成功如图:


开始生成.h文件,选中JNI类右键->New->External Tools->javah,如图:


成功后如图:


3.1.2方法二

右键拖动JNI类所在的包的路径到Terminal,自动切换到该目录下


javac编译生成class文件(生成class文件的方法有很多,这里提供一种)


右键拖动java文件夹到Terminal,自动切换到该目录下


必须在包名外使用javah命令,编译生成.h文件,把.h文件移动到jni文件夹(生成.h文件后可以删除class文件)如图:


3.2、创建文件 JniLib.cpp 、Android.mk、Application.mk

在jni目录下分别创建并编写 JniLib.cpp、Android.mk、Application.mk 这三个文件


复制.h文件内容到JniLib.cpp并修改,如下(此文件为JNI内容文件):

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_jni_jnitest_JNITest */

/*
 * Class:     com_jni_jnitest_JNITest
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_jni_jnitest_JNITest_getString
  (JNIEnv * env, jobject jobject){

  return (*env).NewStringUTF("成功调用JNI内容");

  }

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := JniLib
LOCAL_SRC_FILES =: JniLib.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_MODULES := JniLib
APP_ABI := all

4、其它相关配置

4.1 修改app下的build.gradle文件, 如下图

ndk{
            moduleName "JniLib"
//            abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定的三种abi体系下的so库
        }
        sourceSets.main{
            jni.srcDirs = []
            jniLibs.srcDir "src/main/libs"
        }

4.2 项目下的gradle.properties文件(如果没有此文件,自己新建一个)添加代码:

android.useDeprecatedNdk=true

5、执行ndk-build

此处我用的是配置好的工具来执行,和 3.1.1 一样的步骤

选中JNI类右键->New->External Tools->ndk-build,结果如图:


6、调用so

package com.jni.jnitest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    Button button;
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        tv = findViewById(R.id.tv);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv.setText("结果:"+ new JNITest().getString());
            }
        });

    }
}

结果


Demo 


下一篇 Android Studio 3.0 SO文件的引用

你可能感兴趣的:(Android开发笔记)