在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>
程序执行画面: