Android Studio开发JNI工程

本文详细介绍了使用Android Studio创建NDK工程的全过程,包括添加native接口、执行编译、生成c头文件、配置NDK路径、解决编译问题以及安装运行的完整步骤。通过遵循指南,开发者可以顺利地将C/C++代码整合进Android应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:http://blog.youkuaiyun.com/sodino/article/details/41946607

使用Android Sutdio创建一个新的工程后,接下来记录创建NDK工程的基本步骤。

本文将达到:
1. 创建NDK工程
2. 在JNI中输出Log语句
3. 指定编译的so库的abi版本
4. 解决在创建NDK工程中的问题

Step: 1. 添加native接口
注意写好native接口和System.loadLibrary()即可了,并无特别之处。
P.S:onCreate()中对R.id.txt执行setText(),所以这里需要对xml布局文件按正常的开发步骤进行修改即可。

直接给出代码如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class MainActivity extends Activity{
static {
System.loadLibrary(“JniTest”);
}

public native String getStringFromNative();  
@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    TextView txtView = (TextView) findViewById(R.id.txt);  
    txtView.setText(getStringFromNative());  
}  

}

Step: 2.执行Build->Make Project

这一步骤执行一下,验证工程中并无其它错误,并对工程进行了编译,生成了.class文件.
.class文件的生成路径是在 app_path/build/intermediates/classes/debug下的.如下图:

Step: 3.javah生成c头文件
点击”View->Tool Windows->Terminal”,即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件。
这里需要注意的是要进入 \app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在\app\src\main路径下,可以在Studio的工程结构中直接看到。

操作命令:
javah -d jni -classpath

include

include

ifndef LOG_TAG

define LOG_TAG “ANDROID_LAB”

define LOGE(…) android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS)

endif

/* Header for class lab_sodino_jnitest_MainActivity */

ifndef _Included_lab_sodino_jnitest_MainActivity

define _Included_lab_sodino_jnitest_MainActivity

ifdef __cplusplus

extern “C” {

endif

/*
* Class: lab_sodino_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative
(JNIEnv * env, jobject jObj){
LOGE(“log string from ndk.”);
return (*env)->NewStringUTF(env,”Hello From JNI!”);
}

ifdef __cplusplus

}

endif

endif

到这里后,我们再执行一个”Build->Make Project”,发现”Messages Gradle Build”会给出提示如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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)
这里提示了NDK未配置,并且需要在工程中的local.properties文件中配置NDK路径。好了,提示很清楚了,那我们就进入下一步吧。

Step: 5.配置NDK
这一步包括两个动作:
1.指明ndk路径

  1. 修改build.gradle配置
    工程中共有两个build.gradle配置文件,我们要修改的是在\app\build.gradle这个文件。为其在defaultConfig分支中增加上
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    ndk {
    moduleName “JniTest”
    ldLibs “log”, “z”, “m”
    abiFilters “armeabi”, “armeabi-v7a”, “x86”
    }
    以上配置代码指定的so库名称为JniTest,链接时使用到的库,对应android.mk文件中的LOCAL_LDLIBS,及最终输出指定三种abi体系结构下的so库。
    添加后如下图:

这时,再执行”Build->Rebuild Project”,就可以编译出so文件了。
但在Window平台上会出现一个问题:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
Error:Execution failed for task ‘:app:compileDebugNdk’.

com.android.ide.common.internal.LoggedErrorException: Failed to run command:
D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86
Error Code:
2
Output:
make.exe: * No rule to make target C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni', needed byC:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o’. Stop.
出现这个错误很莫名其妙..几番折腾下,找到一个视频出来了大概原因及解决方式:
出处见Youtube视频 02:50分开始:https://www.youtube.com/watch?v=okLKfxfbz40#t=362
在Windows下NDK一个bug,当仅仅编译一个文件时出现会出现此问题,解决方法就是再往jni文件夹加入一个空util.c文件即可。如下图:

编译出来的库文件被Studio输出到了下图的路径中

Step: 6.安装运行
界面:

查看Log打印:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值