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

在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>

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

阅读更多
版权声明:本文为博主原创文章,未经博主允许转载。 https://blog.csdn.net/jklinux/article/details/78090995
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭