之前一直参考这一篇链接进行配置开发,但是出现很多问题,最后程序运行到手机上就自动退出 ,主要原因是根本没有生成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.mk
,Application.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} {
}