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

来源:互联网 发布:软件模型 编辑:程序博客网 时间:2024/06/06 22:22

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

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

原创粉丝点击