使用ndk-build方式在as调用jni

来源:互联网 发布:淘宝开店名字大全 编辑:程序博客网 时间:2024/06/03 06:46

在比较新的as上,调用jni有一些比较方便的方式比如使用cmake或者使用build工具,参考我博客中其他几篇文章

http://blog.csdn.net/findsafety/article/details/70053267

http://blog.csdn.net/findsafety/article/details/70053822

http://blog.csdn.net/findsafety/article/details/70059084


本文demo的地址为http://download.csdn.net/detail/findsafety/9843922

但还是希望能够用传统的方式来,这样在集成原来的eclipse项目也许会方便一点,所以这篇文章就是用ndk-build方式通过makefile来生成so进行调用

1 我们新建立一个项目,因为不想用新方式来调用jni ,所以不勾选include c++ support




2  在项目根目录下面的gradle.properties文件里面加上

android.useDeprecatedNdk=true



3 在src/main目录下面创建一个文件夹,名字叫做jni



4 在MainActivity里面声明native方法

public native String stringFromJNI();


 


5 点击菜单上的build -> make project ,这时候会在app/build/intermediates生成一个叫做classes的文件夹,里面会生成 MainActivity.class,这是我们下一步生成头文件的基础


6 点击底部的terminal栏,分别执行2个命令

cd app/src/main/java

javah -jni com.ksxx.testndkbuild.MainActivity

这样我们可以看到在java文件夹下面生成了一个.h文件





7 我们在jni文件夹下面创建一个.c文件,里面定义一个函数,函数的名称 返回值参照刚才生成的头文件



8 然后再在jni文件夹下面创建2个文件,分别为Android.mk和Applicaiton.mk

Android.mk文件里面

在这里LOCAL_MODULE是指你要生成的so文件的名字,LOCAL_SRC_FILES是指对应的c文件名字(都可以自己改的)

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := helloLOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_SHARED_LIBRARY)



APP_ABI := all


9   再次进入terminal , 输入命令

cd ../jni

这样我们就进入到了jni目录,然后执行命令ndk-build

就会在app/main目录下面生成libs文件夹,里面会生成我们所需要的so文件





10 既然生成的so文件是在libs目录下面,而我们的java端要引用的话,是需要指定路径的,所以我们在build.gradle里面加入下面这段

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


如果不想指定也可以,在app/src/main下面建立一个文件夹名字为jniLibs,这个文件夹会被as自动打包进去所以就不需要我们指定路径


11 在java层的MainActivity中加入so文件的加载语句

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




我们在activity中设置显示文本为jni中返回的内容


这个时候我们run一下,就可以看到效果了


原创粉丝点击