“Android Studio”下“JNI”开发(linux.ubuntu)

之前一直参考这一篇链接进行配置开发,但是出现很多问题,最后程序运行到手机上就自动退出 ,主要原因是根本没有生成jni对应的so文件,当然会报错,调试了一天,参考了这一篇,写的还是比较明白:链接。本文按照该教程,根据自己的操作系统完成“Android Studio”下“JNI”开发流程梳理。


[目的]

在java主函数中调用jni程序,并弹出toast界面。

[步骤]

新建项目工程,或者在已有工程中实践。
 我的工程名为:CallAshleyT,在Android Studio中打开,切换到Project模式。
build.gradle配置

在android类下添加以下代码:

    sourceSets.main {
          jni.srcDirs = []
          jniLibs.srcDirs = ['src/main/jniLibs']//设置目标的so存放路径
    }
        task ndkBuild(type:Exec,description:'Compile JNI source via NDK'){
          commandLine "/home/wlf/Android/Sdk/ndk-bundle/ndk-build",//配置ndk的路径
            'NDK_PROJECT_PATH=build/intermediates/ndk',//ndk默认的生成so的文件
            'NDK_LIBS_OUT=src/main/jniLibs',//配置的我们想要生成的so文件所在的位置
            'APP_BUILD_SCRIPT=src/main/jni/Android.mk',//指定项目以这个mk的方式
            'NDK_APPLOCATION_MK=src/main/jni/Application.mk'//指定项目以这个mk的方式
    }
        tasks.withType(JavaCompile){
        //使用ndkBuild
        compileTask ->compileTask.dependsOn ndkBuild
        }
gradle.properties配置

在文件中增加一行:
android.useDeprecatedNdk = true

创建JNI类。

展开工程列表,在app->src->main->java目录下,右键点击包名,(我的是:com.example.wlf.callashleyt),选择New->Java class,填写类名:JNI.确认后在包目录下生成JNI文件,打开文件,并键入代码:

package com.example.wlf.callashleyt;
public class JNI {
    public static native String helloFromC();
}
在MainActivity中调用helloFromC()方法。

主要代码:

JNI jni = new JNI();
Toast.makeText(this, jni.helloFromC(),Toast.LENGTH_SHORT).show();
创建C文件
  • 右击项目名称,点击新建New->folder->jni folder,默认情况下会在main目录下创建一个jni文件夹。
  • 右击刚才创建的jni文件夹,点击New->C/C++ Source File,name:hello-jni.Type:.c,并勾上[Create an associated header],完成后将在jni目录下生成hello-jni.c和hello-jni.h两个文件。点击项目名,然后点击菜单栏Build->Build Module ‘callAshleyT’.运行后有可能会报错,此时按照Event log里的错误提示更正。这里面对Build Module命令实际执行的操作还不是很清楚。
生成头文件

打开Terminal输入指令:cd app/build/intermediates/classes/debug以及javah -jni com.example.wlf.callashleyt.JNI,运行后会在本目录下生成头文件,将该文件复制到/src/main/jni目录下。

编写C 文件
#include <jni.h>
#include "com_example_wlf_callashleyt_JNI.h"
JNIEXPORT jstring JNICALL Java_com_example_wlf_callashleyt_JNI_helloFromC
(JNIEnv *env, jclass obj)//函数格式可从生成的头文件中拷贝,并加上形式参数名env,obj
{
    char chars[] = "Hello From C,wlf!";
    return (*env)->NewStringUTF(env,chars);
}
新建mk文件

在jni目录下新建两个文件:Android.mkApplication.mk
内容分别为:
- Application.mk

APP_ABI:=all
  • Android.mk
OCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := jni_demo

LOCAL_SRC_FILES := jni.c

include $(BUILD_SHARED_LIBRARY)

报错信息

  • 新建类报错的解决方法:
    Settings->Editor-> file and Code Templates->Files->Class:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
public class ${NAME} {
}

猜你喜欢

转载自blog.csdn.net/wlfbitfc/article/details/81877858