Android Studio里的jni实现方法(一)

原创 2017年09月26日 00:26:10

在Android Studio里可以直接创建支持c++代码的工程, 在如下图中选上即可直接在工程里实现jni的编码操作:
这里写图片描述

创建支持c++代码的工程后,工程目录里会有cpp子目里,里面会有native-lib.cpp文件, 可以里面编写jni操作的C++代码.
这里写图片描述


如在jni里实现用c++代码调用Linux系统的文件读写操作. 窗口上实现点击一个按钮调用jni把内容写入文件里,点击别一按钮调用jni把文件内容读出.

/* MyActivity.java */
package com.example.jk.testjni;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;


public class MyActivity extends Activity {
    private LinearLayout vlayout;
    private Button btn_read, btn_write;
    private EditText editText;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        vlayout = new LinearLayout(this);
        btn_read = new Button(this);
        btn_write = new Button(this);
        editText = new EditText(this);

        btn_read.setText("read");
        btn_write.setText("write");

        vlayout.setOrientation(LinearLayout.VERTICAL);
        vlayout.addView(btn_read);
        vlayout.addView(btn_write);
        vlayout.addView(editText);

        setContentView(vlayout);

        btn_write.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                writeToFile(editText.getText().toString()); //调用jni里的写文件
            }
        });

        btn_read.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                editText.setText("read from file: "+readFromFile()); //调用jni里的读文件
            }
        });
    }

    static {
        System.loadLibrary("native-lib"); //此处的"native-lib"与文件名"native-lib.cpp"一致
    }

    //声明jni里实现的函数
    public native String readFromFile(); //从文件"/sdcard/my.txt"里读出内容
    public native void writeToFile(String str); //把字符串内容写入到文件"/sdcard/my.txt"里
}
/* native-lib.cpp */
#include <jni.h>
#include <string>
#include <unistd.h>
#include <fcntl.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_jk_testjni_MyActivity_readFromFile(JNIEnv *env, jobject obj) {

    char data[100];
    int fd = open("/sdcard/my.txt", O_RDONLY);
    int ret ;

    if (fd > 0) {
        ret = read(fd, data, sizeof(data));
        data[ret] = 0;
        close(fd);
    }

    return env->NewStringUTF(data);
}

extern "C"
JNIEXPORT void JNICALL
Java_com_example_jk_testjni_MyActivity_writeToFile(JNIEnv *env, jobject obj, jstring str) {

    const char *data = env->GetStringUTFChars(str, 0);
    int len = env->GetStringLength(str);

    int fd = open("/sdcard/my.txt", O_WRONLY|O_CREAT, 0777);
    write(fd, data, len);
    close(fd);
}

// 注意jni里的函数是按"Java_完整的包名_activity类名_函数名"来命名的
// extern "C" 语句是用于兼容C动态库使用的, 不加会发生执行出错.

最后,需要在工程的AndroidManifest.xml里增加写sd的权限:

/* AndroidManifest.xml */
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.jk.testjni">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MyActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN"></action>
                <category android:name="android.intent.category.LAUNCHER"></category>
            </intent-filter>

        </activity>

    </application>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

</manifest>

程序执行画面:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许转载。

android studio jni使用的几种方法(一)

android使用java自带的JNI接口来调用C或者C++的代码,在之后的几篇文章中我会介绍android studio中几种常用的方法来使用JNI       1. 最简单的方法,利用andro...
  • kkkes
  • kkkes
  • 2016年09月06日 20:42
  • 1927

Android Studio使用jni、so库

Android Studio使用jni、so库在Android Studio1.1之后,AS就已经支持jni和so库了,马上发布的1.3正式版,更是可以在clion环境下编译c、c++,更加方便的使用...
  • x359981514
  • x359981514
  • 2015年06月02日 10:00
  • 10561

Android Studio 配置快捷方式生成JNI头文件的方法

Android Studio快捷键生成JNI头文件
  • venusic
  • venusic
  • 2016年04月07日 17:54
  • 4090

JNI(一) - Android Studio简单开发流程

内容介绍:JNI(一) - Android Studio简单开发流程 版权声明:本文为原创文章,未经允许不得转载 联系方式:815852777@qq.com 博客地址...
  • KevinDGK
  • KevinDGK
  • 2016年10月14日 09:47
  • 7657

在Android Studio中使用Jni

前提: NDK环境已经搭建好, windows下需要安装cygwim android studio指向正确的ndk 1、新建一个Android项目, 选择Empty A...
  • cxq234843654
  • cxq234843654
  • 2016年03月19日 16:21
  • 2168

Android Studio中JNI使用的一些出现的错误及方法

错误一 出现 Error: NDK integration is deprecated in the current plugin. 在gradle.properties 文件里面添加 andro...
  • qq_24536171
  • qq_24536171
  • 2017年03月27日 13:28
  • 1116

Android Studio NDK 入门教程(8)--JNI动态注册本地方法

这里可以提供另外一种方法来动态注册c++函数,让其根Java中的native方法关联起来。...
  • venusic
  • venusic
  • 2016年09月09日 15:20
  • 1845

Androidstudio编译c/c++jni方法

本文微信公众号授权fanfan程序媛独家发布 转载注明出处: 本文出自fanfan的博客Androidstudio编译jni 开发环境:Androidstudio2.3 开发目的:在Android...
  • zrf1335348191
  • zrf1335348191
  • 2017年06月29日 17:33
  • 1664

Android 动态注册JNI函数

1.JNI函数注册方式 在Android开发中,由于种种原因我们需要调用C/C++代码,在这个时候我们就需要使用jni了, jni在使用时要对定义的函数进行注册,这样java才能通过native关...
  • u010925331
  • u010925331
  • 2016年03月27日 16:50
  • 1707

【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi...
  • JIJIJIJIJIJIJIJI
  • JIJIJIJIJIJIJIJI
  • 2016年10月10日 14:07
  • 1628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Studio里的jni实现方法(一)
举报原因:
原因补充:

(最多只允许输入30个字)