Android NDK(1、简单入门和遇到的问题)

本文详细介绍了如何配置NDK环境并实现简单的JNI示例,包括下载NDK、配置路径、生成并调用.so文件的过程。同时,还列举了一些常见问题及解决办法。

1、NDK环境配置

1、NDK下载和路径配置

NDK Location
这里写图片描述

2、在grale.properity中添加

android.useDeprecatedNdk=true

2、简单示例

1、Jni测试方法

public class JniTest {
    static {
        System.loadLibrary("jniStr");
    }
    public static native String getJniString();

}

这里写图片描述

2、生成.h文件

通过javah生成头文件

javah com.example.myndkdemo.JniTest

这里写图片描述

3、创建jni文件

在app/src/main目录下创建jni,并把刚刚生成的文件剪切到这个文件下
这里写图片描述

4、创建测试.c文件

右键-new-c/c++Source file,然后编写文件
1、#include
2、创建方法,并且返回,方法名称与上面.h文件相同,注意参数

#include <string.h>
#include <jni.h>
#include "com_example_myndkdemo_JniTest.h"

/**
*/
JNIEXPORT jstring JNICALL Java_com_example_myndkdemo_JniTest_getNdkString(JNIEnv *env, jclass thiz){

    return env->NewStringUTF("Hello i m NDK !");
}

这里写图片描述

5、生成so文件

build.gradle文件配置如下

 ndk{
            moduleName "MyNdk"
           // abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,可忽略

        }

生成so文件,只需要重新build下

这里写图片描述

这样so文件创建成功

5、最后调用

public class MainActivity extends AppCompatActivity {
    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text= (TextView) findViewById(R.id.text);
        text.setText(JniTest.getJniString());
    }
}

运行结果:
这里写图片描述

3、遇到的问题

1、ndk没有生成so文件,可能是如下原因

1、没有在在grale.properity中添加

android.useDeprecatedNdk=true

2、当初创建jni目录位置不正解
创建jni目录是在main目录下,不是java目录下
这里写图片描述
3、有可能是ndk下载的文件损坏

2、生成so文件后,调用so库,报错Native method not found:

我在这错误产生的原因是方法名和参数上

#include <string.h>
#include <jni.h>
#include "com_example_myndkdemo_JniTest.h"

/**
*/
JNIEXPORT jstring JNICALL Java_com_example_myndkdemo_JniTest_getNdkString
(JNIEnv *env, jclass thiz){

    return env->NewStringUTF("Hello i m NDK !");
}

在方法名称和参数必须和.h文件中相同,
(JNIEnv *env, jclass thiz)中JNIEnv和jclass必须和.h中相同,如果不相同,则会报上面的错误。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值