【Android】windows下使用android studio和ndk-build编译c程序生成so库
一、编译环境
1. 安装ndk
首先把ndk安装好,比较简便的方法是通过android studio的SDK manager来安装,上图。
把NDK方框勾选上。
2. 配置ndk location
这一步告诉ndk-build在哪里,
在File选项卡中选择Project Structure,
在Android NDK location那里设置你的ndk路径。
设置好之后,local.properties文件中看到如下内容说明设置成功。
然后在在gradle.properties的文件末尾加上android.useDeprecatedNdk=true,ndk的配置才算完成。
二、java及c代码编写
1. java代码编写
举例说明,在src/main/java包下面新建一个java类JNITest.java,里面写一个简单的函数(java调C中的方法都需要用native声明且方法名必须和c的方法名一样)。
package com.example.tongjing.myapplication;public class JNITest { public native String getStringFromC();}
然后选择build选项卡中的make project,会在工程目录下的\build\intermediates、classes\debug\com\example\tongjing\myapplication中看到自己编译后的class文件JNITest.class如下图所示:
2. 生成.h文件
首先打开android studio的Terminal命令行工具,打开步骤是View->Tool Windows->Terminal。
在命令行中进入工程的main目录下,执行命令:
javah -d jni -classpath E:\code\Android\app\build\intermediates\classes\debug com.example.tongjing.myapplication.JNITest
之后就会在main目录下生成jni文件夹,同时生成.h文件。
如果觉得这个文件名太长了,可以自己修改,文件里的内容不要修改。我把名字改成了JNITest.h。
3.编写cpp文件
同样在jni文件夹下新建一个名为JNITest.cpp的文件,内容如下:
其中方法名要和.h文件中保持一致。
完成之后在MainActivity中调用一下。
首先import这个类,然后调用。
package com.example.tongjing.myapplication;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import com.example.tongjing.myapplication.JNITest;public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("JNITest");
JNITest");
} @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Example of a call to a native method TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(new JNITest().getStringFromC()); }}
4. 编译配置
在build.gradle文件的android下的defaultConfig配置块内加入以下内容。
在jni目录下创建Android.mk文件,内容如下:
创建Application.mk,内容如下:
这里的APP_ABI的是目标平台,all代表所有平台,也可以指定特定平台。
在Terminal中执行ndk-build,就可以编译生成so库了。
生成的so文件都在src/main/libs目录下。
最后的结果。
更多相关文章
- Android(安卓)eclipse - aapt.exe has stopped working.
- Android(安卓)学习笔记4---签名Android的执行文件
- Android调试工具adb的高逼格使用方式
- Android中的控件
- Android工程中R.java文件的重新生成——注意资源文件的错误
- Android(安卓)资源,国际化,自适应
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程
- Gradle in Android(安卓)Studio (1) - 构建系统概述
- NPM 和webpack 的基础使用