编译ndk生成.so

编译ndk生成.so

目的:仅仅只是简单的实用ndk生成.so文件

效果:点击按钮button,调用.so文件的内容

ndk版本:android-ndk-r16-beta1

项目目录 如图:

在这里插入图片描述

1.首先看下代码
MainActivity:

public class MainActivity  extends AppCompatActivity {
    private TextView textView;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=(TextView)findViewById(R.id.textview);
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText(GetString.getNdkString()+"");
            }
        });
    }
}

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击获取"
        />

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="dsds"
        />

</LinearLayout>

GetString:

public class GetString {
    static {
        System.loadLibrary("newso");
    }

    public static native String getNdkString();
}

2.生成GetString的.h文件,在java目录下执行: javah -cp sdk路径/sdk/platforms/android-29(可根据自己的修改)/android.jar:. 包名.类名,注意:.后面有个空格,
javah -cp ,例如: javah -cp /Users/machao/Library/Android/sdk/platforms/android-29/android.jar:. com.example.testso.GetString,执行之后会看到如下图:
在这里插入图片描述

3.在main目录下新建jni文件夹,将com_example_testso_GetString.h移动到jni目录下,并且编写Android.mk和Application.mk和ndkGetString.c:
Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := newso
LOCAL_SRC_FILES := ndkGetString.c
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI := all

ndkGetString.c

#include "com_example_testso_GetString.h"
JNIEXPORT jstring JNICALL  Java_com_example_testso_GetString_getNdkString(JNIEnv *env, jobject thiz)  {
    return  (*env)->NewStringUTF(env, "www.baidu.com");;
}

4.Terminal中,目录切换到jni下,执行:ndk目录/ndk-build,例如:
/Users/machao/ndk/android-ndk-r16-beta1/ndk-build
在这里插入图片描述
5.执行完成之后如下图:
在这里插入图片描述
6.在 main下新建jniLibs文件夹,将上图中libs中的.so文件复制进去
7.在app.gradle中:
在这里插入图片描述
8.可能会遇到的问题:

问题1:修改ndk版本,最好不要用studio自带的,我用的是android-ndk-r13b
这里写图片描述

问题2:在gradle.properties中加 android.useDeprecatedNdk=true
这里写图片描述

github地址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值