一手遮天 Android - Native Development Kit: NDK 简单示例

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 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>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

posted @ 2022-07-13 21:01  webabcd  阅读(73)  评论(0编辑  收藏  举报