一手遮天 Android - Native Development Kit: NDK 简单示例
一手遮天 Android - Native Development Kit: NDK 简单示例
示例如下:
/ndk/NdkDemo1.java
/**
* NDK 的简单示例
*
* 1、先配置 ndk-build
* 在 File -> Settings -> Tools -> External Tools 中新增一项
* name: ndk-build
* Program: F:\Android\sdk\android-ndk-r23\ndk-build.cmd
* Arguments: NDK_LIBS_OUT=D:\gitroot\AndroidDemo\app\src\main\jniLibs
* Working directory: D:\gitroot\AndroidDemo\app\src\main
*
* 2、在 app\src\main 下新建 jni 目录(用于保存源代码文件)
* 在 app\src\main 下新建 jniLibs 目录(用于保存编译后的 so 文件)
*
* 3、在 jni 文件夹上点击右键,然后单击 External Tools -> ndk-build 进行编译
*/
package com.webabcd.androiddemo.ndk;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.webabcd.androiddemo.R;
public class NdkDemo1 extends AppCompatActivity {
private TextView _txtMsg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ndk_ndkdemo1);
_txtMsg = this.findViewById(R.id.txtMsg);
// 加载 so
System.loadLibrary("jniHello");
// java 调用 jni, c
String resultC = helloJniC();
_txtMsg.append(resultC);
}
// 调用 libjniHello.so 的 JNIEXPORT jstring JNICALL Java_com_webabcd_androiddemo_ndk_NdkDemo1_helloJniC(JNIEnv *env, jobject obj)
public native String helloJniC();
}
/jni/cHello.h
#include <jni.h>
#ifndef _Included_com_webabcd_androiddemo_ndk_NdeDemo1
#define _Included_com_webabcd_androiddemo_ndk_NdeDemo1
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_com_webabcd_androiddemo_ndk_NdkDemo1_helloJniC(JNIEnv *env, jobject obj);
#ifdef __cplusplus
}
#endif
#endif
/jni/cHello.c
#include "cHello.h"
#include <stdlib.h>
JNIEXPORT jstring JNICALL Java_com_webabcd_androiddemo_ndk_NdkDemo1_helloJniC(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "hello: ndk");
}
/jni/Application.mk
#如果没有用到 c++ 则可以不配置此文件
/jni/Android.mk
LOCAL_PATH := $(call my-dir)
#模块1
include $(CLEAR_VARS) #清除 LOCAL_MODULE, LOCAL_SRC_FILES 之类的变量
LOCAL_CPP_EXTENSION := .cpp # C++ 文件的扩展名
LOCAL_MODULE := jniHello # 模块名。如果模块名为“abc”,则此模块将会生成“libabc.so”文件。
LOCAL_SRC_FILES := cHello.c # 需要编译的源文件
include $(BUILD_SHARED_LIBRARY) # 编译当前模块
#模块2
/layout/activity_ndk_ndkdemo1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txtMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>