前提条件:
- 本地已经配置好了ndk环境,如果没有配置好,建议参考macos 配置ndk环境-CSDN博客 这篇链接。
新建一个Empty Project
比如我这里的Project的名字是HelloJNI,包名是com.example.hellojni
然后在src目录下,右键选择Add C++ to Module
然后展示的目录如下所示:
在activity_main.xml里给TextView组件添加一个id,整体代码如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
然后在MainActivity.java里添加调用cpp层的代码,调用cpp的库
static {
System.loadLibrary("jnidemo");
}
写一个native方法
public native String stringFromJNI();
MainActivity.java代码整体如下:
package com.example.hellojni;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("hellojni");
}
public native String stringFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.text_view);
textView.setText(stringFromJNI());
}
}
然后需要在jnidemo.cpp里写stringFromJNI的实现方法
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_hellojni_MainActivity_stringFromJNI(
JNIEnv* env,
jobject) {
std::string hello = "Hello From C++";
return env->NewStringUTF(hello.c_str());
}
其中cpp层这个方法的命名是Java_包名_类名_方法名
- 包名 com.example.hellojni
- 类名 MainActivity
- 方法名 stringFromJNI
第八行是一个string对象,内容是“Hello From C++”,然后第九行是返回一个jni的string对象
这里的返回值就是给到了Java层的stringFromJNI的返回值。
最后MainActivity里通过展示这个string显示在视图上,表示Java层调用cpp层的成功了。
看下运行结果: