前提条件:
新建一个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_包名_类名_方法名
第八行是一个string对象,内容是“Hello From C++”,然后第九行是返回一个jni的string对象
这里的返回值就是给到了Java层的stringFromJNI的返回值。

最后MainActivity里通过展示这个string显示在视图上,表示Java层调用cpp层的成功了。
看下运行结果:
