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 Studio快捷键生成JNI头文件

Android Studio 下进行jni开发及打包方法

最近几天查找了好多关于Android Studio开发JNI资料的资料,但是一直编译不成功!原因可能是和Android Studio的最新版本有关,或者多数都是使用Eclipse进行Android J...

Android Studio NDK环境配置及JNI使用方法

Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在Windows平台下是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使Java可以实现和本地机器...

Android Studio生成Jni头文件的方法

总共有三种方式生成Jni头文件,但归根结底只有一种,只是操作方法不一样,我在这里做一下记录,方便下次使用。 1.1          1.利用Android Studio的Terminal,进入你自己...

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

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

Android Studio生成Jni头文件的方法

提前说明,本文转载于:http://blog.csdn.net/wang_zhi_hao/article/details/49126955 我采用第一个种方法解决问题,在Android sudio ...

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

错误一 出现 Error: NDK integration is deprecated in the current plugin. 在gradle.properties 文件里面添加 andro...

超级简单的Android Studio jni 实现(无需命令行)

1.配置Anroid Studio(这步是关键)2.配置完成就可以使用javah 、ndk-build、ndk-build clean这三个命令了,那么在哪里使用这些命令,请看下图3.配置完成,我们开...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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