一个JNI的demo

1 篇文章 0 订阅

JNI(Java Native Interface),写这玩意儿的用处:能够在java中调用c/c++的方法。
NDK(Native Development Kit),就是写JNI需要的一个工具。
写这个demo的前提,你已经下载好了NDK,并且配置好了他的环境变量。
进入正题:
第一步:
新建一个AS项目:JniDemo2。如图配置项目的NDK环境。

在这里插入图片描述
在这里插入图片描述
第二步:
在java文件夹下新建JniUtils类

public class JniUtils {
    static {
        System.loadLibrary("JNISample");//名字要与build.gradle中配置的一致
    }
    public static native String getStringFromC();
}

第三步:
Make Project
在这里插入图片描述
第四步:
打开Terminal,然后在命令行中先进入到工程的build\intermediates\classes\debug目录下(cd 直接拖拽debug目录即可)
在这里插入图片描述
第五步:
使用javah命令生成.h头文件。
在这里插入图片描述
第六步:
新建一个JNI文件夹,将生成的.h文件复制过来
在这里插入图片描述
.h文件所在目录(debug文件夹下)
在这里插入图片描述
第七步:
在jni文件夹下新建一个c语言文件:HelloJni
在这里插入图片描述

#include "com_example_qny_jnidemo_JniUtils.h" //头文件的名字要对应

//方法名也要对应,格式:Java_+头文件名+JniUtils类中的方法名。例如:com_example_qny_jnidemo_JniUtils + _getStringFromC(注意这里的下划线)
JNIEXPORT jstring JNICALL Java_com_example_qny_jnidemo_JniUtils_getStringFromC
        (JNIEnv *env, jclass obj){
    char* text = "Im from cccccccccccccc";
    return (*env) -> NewStringUTF(env,text);
}

第八步:
在app目录下的build.gradle中添加

ndk {
            moduleName "JNISample" //生成so库的名字,这里要与JniUtils类中的static块中的名字相同
    }

在这里插入图片描述
第九步:
在gradle.properties文件中加入以下代码

android.useDeprecatedNdk=true

在这里插入图片描述

第十步:
在MainActivity 中打印输出,验证是否成功使用java语言调用c程序

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //使用java代码调用c语言程序
        JniUtils jniUtils = new JniUtils();
        Log.d("JniInFo",jniUtils.getStringFromC());
    }
}

运行程序会出现这个bug
在这里插入图片描述
出现bug不要慌~我们操作一波,然后重启AS就没了。
在这里插入图片描述
在这里插入图片描述

再次运行后成功调用!:
在这里插入图片描述
最后贴一张整个项目的截图:
在这里插入图片描述
参考的文章,我觉得作者的c语言文件代码写错了,我是改过以后才成功运行的,用他写的没运行成功。

https://www.jianshu.com/p/1955dc248d72

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值