mac端使用Androidstudio开发JNI(ndk-build版本)

461 阅读1分钟

mac端使用Androidstudio开发JNI(ndk-build版本)

Native Develop Kit,是Android 的一部分,与Java无直接关系

androidstudio2.2开始支持的比较老的方式,主要依赖于配置文件Android.mk与Application.mk

@[toc]

一、首先新建空白AndroidStudio工程

新建空白androidstudio工程,定义jni方法如下

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("jni_demo");
    }

    public native String getStringFromC();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toast.makeText(this, new MainActivity().getStringFromC(), Toast.LENGTH_SHORT).show();
    }
}

二、使用javah生成头文件

移动头文件到app/jni目录下

cd app/src/main/java javah com.hs.androidjnidemo.MainActivity

<img src="/Users/zhanglei/Library/Application Support/typora-user-images/image-20210721133302408.png" alt="image-20210721133302408" style="zoom:50%;" />

新建jni_demo.cpp或者jni_demo.c,名称与System.loadLibrary保持一致

Jni_demo.cpp内容如下

注意:cpp的NewStringUTF入参只有一个,同时env不需要*env

#include "com_hs_androidjnidemo_MainActivity.h"
#include "jni.h"
#include <stdio.h>

JNIEXPORT jstring JNICALL Java_com_hs_androidjnidemo_MainActivity_getStringFromC (JNIEnv *env, jobject obj) {
    return env->NewStringUTF("string from cpp");
}

Jni_demo.c内容如下

#include "com_hs_androidjnidemo_MainActivity.h"
#include "jni.h"
#include <stdio.h>

JNIEXPORT jstring JNICALL Java_com_hs_androidjnidemo_MainActivity_getStringFromC (JNIEnv *env, jobject obj) {
    return (*env)->NewStringUTF(env,"string from c");
}

三、配置ndk开发环境

local.properties配置ndk路径

ndk.dir=/Users/zhanglei/Library/Android/sdk/ndk/22.0.7026061

app/build.gradle/android中配置ndk加载libs

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

四、配置ndk-build编译环境

新建Android.mk,注意入口文件jni_demo.cpp保持一致

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jni_demo
LOCAL_SRC_FILES := jni_demo.cpp

include $(BUILD_SHARED_LIBRARY)

新建Application.mk

APP_PLATFORM := android-14
APP_ABI :=all

五、编译生成so

cd到jni入口目录,执行

ndk-build

<img src="/Users/zhanglei/Library/Application Support/typora-user-images/image-20210721133834351.png" alt="image-20210721133834351" style="zoom:50%;" />

执行结果如下。其中obj文件夹可以删除

<img src="/Users/zhanglei/Library/Application Support/typora-user-images/image-20210721135647523.png" alt="image-20210721135647523" style="zoom:50%;" />

点击运行成功如下

src="/Users/zhanglei/Library/Containers/com.tencent.qq/Data/Library/Caches/Images/DBA39EB4C0BBF69661FD00F165F8961F.jpg" alt="DBA39EB4C0BBF69661FD00F165F8961F" style="zoom: 25%;" /> demo地址