网上很多关于安卓使用jni调用c的例子,比较杂乱,有的还是使用cygwin,今天小弟来总结一下,直接用安卓的ndk来生成.so文件.不用不足之处敬请指出.
一,材料:
Eclipse,Android SDK,jdk,ADT,Android NDK
以上比较难下到的应该是ndk了:
windows32位,360云盘: http://yunpan.cn/cQjZSsnWJbawx 访问密码 292b
windows64位,百度云盘: http://pan.baidu.com/s/1i3H42JN 访问密码 59eh
ndk下载完毕后,双击解压
二,环境变量配置:
1,安卓各种环境配置
2,环境变量path追加: ;D:\rar\android-ndk-r10d(解压出来的路径)
三,配置ndk到Eclipse
1,选择Android>NDK,将刚才解压出的文件选中
2,新建一个普通的安卓项目,到刚才解压后的ndk文件夹下把samples\hello-jni\jni考到此项目中,并把Android.mk,Application.mk以外的文件删掉.
Android.mk是关联java和c层的文件,Application.mk用来配置根据不同cpu生成不同.so文件
3,配置javaH,配置完成后可以直接在Eclipse里生成头文件,而不必再进到命令行里敲各种命令了.
依次点击:Run>External Tools>External Tools Configurations ,来到配置面板
配置生成头文件的执行命令:
1,点击新建,Name里输入javaH,也可以是其他名字;
2,Location选择中间那个Browse File System,把当前jdk\bin\javah.exe选中;
3,Work Directory:单击Variables,选中project_loc,并在后面加上\src
4,Arguments:输入:
-classpath ${project_loc}\bin\classes;F:\new_fila\sdk\platforms\android-20\android.jar -d ${project_loc}\jni -jni ${java_type_name}
-classpath 后面接的是.class的路径,注意"F:\new_fila\sdk\platforms\android-20\android.jar"为当前安卓SDK的android.jar路径,platforms下随便一个版本都行.如果不加,当目标类里有引用安卓包时,在生成头文件时会报找不到安卓的类,如"找不到......Activity";
-d 后面接的是你要把生成的.h文件放在哪个路径下
-jni 后面接目标类
这些其实会转化为一条javah命令
按图勾选:
按图勾选:
4,配置ndk-build命令,配置完成后可以在Eclipse里点击按钮来生成.so,不必再进命令行里操作了:
类似上面的方式,此处Location选取ndk的ndk-build.cmd
5,编写本地方法,如:
package com.example.ndk_demo; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class MainActivity extends Activity { public static native String getStringFromC(); TextView showMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showMessage = (TextView) findViewById(R.id.tv_show_ndk); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { showMessage.setText(getStringFromC()); } }); } }
6,生成头文件,依次单击:目标类>Run工具>javaH(刚才配置的)
刷新项目,在jni文件夹下,生成了.h文件:
7,在jni文件夹下,新建demo.c,实现本地方法
#include <string.h> #include <jni.h> #include "com_example_ndk_demo_MainActivity.h"//把头文件导入 //把刚才头文件里的方法直接拷贝过来,并实现, //注意此处多了一个"1",我删除后,发现运行报错:找不到本地方法,所以我建议直接拷贝处理 JNIEXPORT jstring JNICALL Java_com_example_ndk_1demo_MainActivity_getStringFromC ( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Hello from JNI ! "); }
8,修改Android.mk,此处的demo即将要生成的.so的名字,最终将使是"libdemo.so",demo.c则是c文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := demo LOCAL_SRC_FILES := demo.c include $(BUILD_SHARED_LIBRARY)
9,执行ndk-build,依次单击:项目>Run工具>ndk-build(刚才配置的)
10,生成.so文件,其路径为obj
四,调用,demo里就是一个按钮点击后,textview显示一个字符串,此字符串来自.so文件:
package com.example.ndk_demo; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class MainActivity extends Activity { //导入本地文件 static { System.loadLibrary("demo"); } public static native String getStringFromC(); TextView showMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showMessage = (TextView) findViewById(R.id.tv_show_ndk); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { showMessage.setText(getStringFromC()); } }); } }
效果:
至此,实现了简单的ndk开发!
安卓NDK开发入门DEMO
最新推荐文章于 2024-08-23 22:46:51 发布