重温android studio jni编译生成so文件
转载请注明:http://blog.csdn.net/u012255016/article/details/51026437
步骤:
1、创建一个android工程
2、编译工程,Buiid->Make Project生成class文件
3、配置NDK
4、创建一个NdkUtil类
5、创建main.c和一个空的c文件empty.c
6、编译工程,生成so文件
7、复制so文件到jniLibs下
8、完成使用
具体实现:
1、创建一个android工程(这个就不废话了)
2、编译工程,Buiid->Make Project生成class文件,生成.h头文件
(1)点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件。
操作命令: javah -d jni -classpath
或 javah -d jni -classpath G:\czz_svn\FFmpegAndroid\app\build\intermediates\classes\debug com.czz.widgetdemo.MainActivity (前期要配环境变量
修改电脑的环境变量,添加一个变量,变量名:ANDROID_HOME 变量值 :是你sdk的路径 比如我的是D:\Android\android-sdk
然后修改ClassPath最后添加
%ANDROID_HOME%\platforms\android-22\android.jar;%ANDROID_HOME%\extras\android\support\v4\android-support-v4.jar;%ANDROID_HOME%\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar)
3、配置NDK
(1)在local.properties文件添加ndk路径,没有ndk,自行下载http://wear.techbrood.com/tools/sdk/ndk/
(2)修改build.gradle配置(注:生成so文件过后请注释掉)
4、创建一个NdkUtil类,创建的方法请与so文件的c方法一致
注:我们生成的so文件全名是libmyso.so,使用时是myso
package com.czz.widgetdemo;/** * Created by czz on 2016/3/31. */public class NdkUtil { static { System.loadLibrary("myso"); } public static native String getStringFromNative();}
5、创建main.c和一个空的c文件empty.c
/* DO NOT EDIT THIS FILE - it is machine generated */ #include #include #ifndef LOG_TAG #define LOG_TAG "ANDROID_LAB" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #endif#ifndef _Included_com_czz_widgetdemo_MainActivity#define _Included_com_czz_widgetdemo_MainActivity#ifdef __cplusplus extern "C" { #endifJNIEXPORT jstring JNICALL Java_com_czz_widgetdemo_NdkUtil_getStringFromNative(JNIEnv * env, jobject jObj){ return (*env)->NewStringUTF(env,"czz重温android studio生产so文件"); } #ifdef __cplusplus}#endif#endif
6、编译工程,Buiid->Make Project,生成so文件
生成的文件目录在:工程名\app\build\intermediates\ndk\debug\lib
7、复制so文件到jniLibs下
在main文件夹下创建jniLibs文件夹,复制so文件存放于此
8、完成,使用
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.id_text); tv.setText(NdkUtil.getStringFromNative()); }}
遇到的error:
Error:Execution failed for task ':app:compileDebugNdk'.> NDK not configured.Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.(On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
解决方法:local.properties文件,配置ndk路径
Error:Execution failed for task ':app:compileDebugNdk'.> com.android.ide.common.internal.LoggedErrorException: Failed to run command:D:\Android\android-ndk-r10\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=D:\AndroidWork3\WidgetDemo\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=D:\AndroidWork3\WidgetDemo\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=D:\AndroidWork3\WidgetDemo\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,x86_64,x86,armeabi-v7aError Code:2Output:make.exe: *** No rule to make target `D:\AndroidWork3\WidgetDemo\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/myso/D_\AndroidWork3\WidgetDemo\app\src\main\jni', needed by `D:\AndroidWork3\WidgetDemo\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/myso/D_\AndroidWork3\WidgetDemo\app\src\main\jni\main.o'. Stop.
解决方法:创建一个空的empty.c文件
Native method not found: com.czz.widgetdemo.NdkUtil.getStringFromNative:()Ljava/lang/String;
解决方法:修改main.c文件的方法名一致,Java_com_czz_widgetdemo_NdkUtil_getStringFromNative,其中_com_czz_widgetdemo是包名com.czz.widgetdemo,_NdkUtil是类名
更多相关文章
- Android 笔记:读取配置文件config.properties
- Android模仿表单上传文件
- 在android源码中单独编译modkoid工程遇见的问题
- 文件androidAndroid使用PULL解析和生成XML文件
- android通过JNI用C/C++创建本地文件
- android 开发之文件下载
- Android 第三方库使用实例——编写.so库文件