Android NDK编程
2016-03-23 16:45
435 查看
系统:mac OS,IDE:Android Studio,sdk 5.0,ndk r10e
1, 找到当前用户下的,.bashrc, 添加 export PATH=~~~ndk/android-ndk-r10e:$PATH,
保存退出,执行 source ~/.bashrc 。其中~~~ndk/android-ndk-r10e是你ndk本地的路径
2,创建Android项目
3,创建jni目录,与java目录同级,创建文件:test.cpp, Android.mk, Application.mk
test.cpp
Android.mk
Application.mk
4,切换到jni父目录,执行ndk-build进行编译,生成与jni同级目录libs下,有.so文件,与jni同级创建jniLibs,将.so复制到此处。
5,app的build.gradle文件进行修改
6, 项目的gradle.properties
7, 项目的local.properties,你本机ndk路径
8,如果多人开发,其他开发者需要做的事
(1)java代码相同
(2)创建同样的jinLibs,如果.so是armeabi,需要再创建armeabi目录
(3)项目的gradle.properties 文件 android.useDeprecatedNdk=true"
1, 找到当前用户下的,.bashrc, 添加 export PATH=~~~ndk/android-ndk-r10e:$PATH,
保存退出,执行 source ~/.bashrc 。其中~~~ndk/android-ndk-r10e是你ndk本地的路径
2,创建Android项目
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("jni-test"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView txtOne = (TextView) findViewById(R.id.txt_test_1); txtOne.setText(get()); set("from jni"); } public native String get(); public native void set(String str); public static void methodCallByJni(String msgFromJni) { Log.i("-----jniCallJava", msgFromJni); } }
3,创建jni目录,与java目录同级,创建文件:test.cpp, Android.mk, Application.mk
test.cpp
#include <jni.h> #include <stdio.h> #ifdef __cplusplus extern "C" { #endif void callJavaMethod(JNIEnv *env, jobject thiz) { jclass clazz = env->FindClass("com/yuliang/ndktest/MainActivity"); if (clazz == NULL) { printf("find class MainActivity error!"); return; } jmethodID id = env->GetStaticMethodID(clazz, "methodCallByJni", "(Ljava/lang/String;)V"); if (id == NULL) { printf("find method methodCallByJni error!"); } jstring msg = env->NewStringUTF("msg send by methodCallByJni in test.cpp"); env->CallStaticVoidMethod(clazz, id, msg); } jstring Java_com_yuliang_ndktest_MainActivity_get(JNIEnv *env, jobject thiz) { printf("invoke get in c++\n"); callJavaMethod(env, thiz); return env->NewStringUTF("from JNI so!"); } void Java_com_yuliang_ndktest_MainActivity_set(JNIEnv *env, jobject thiz, jstring string) { printf("invoke set from c++\n"); char* str = (char*)env->GetStringUTFChars(string, NULL); printf("%s\n", str); env->ReleaseStringUTFChars(string, str); } #ifdef __cplusplus } #endif
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jni-test LOCAL_SRC_FILES := test.cpp include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_ABI := armeabi armeabi-v7a
4,切换到jni父目录,执行ndk-build进行编译,生成与jni同级目录libs下,有.so文件,与jni同级创建jniLibs,将.so复制到此处。
5,app的build.gradle文件进行修改
defaultConfig { applicationId "com.yuliang.ndktest" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk { moduleName "jni-test" } }
packagingOptions { exclude 'lib/armeabi/libjni-test.so' }
6, 项目的gradle.properties
android.useDeprecatedNdk=true"
7, 项目的local.properties,你本机ndk路径
ndk.dir=................/ndk/android-ndk-r10e
8,如果多人开发,其他开发者需要做的事
(1)java代码相同
(2)创建同样的jinLibs,如果.so是armeabi,需要再创建armeabi目录
(3)项目的gradle.properties 文件 android.useDeprecatedNdk=true"
相关文章推荐
- android提供的json解析类
- Android学习笔记(29):搜索框SearchView
- android进阶之旅,初级试水型探索(activity四种启动模式详解)
- Android学习笔记(28):三种选择器DatePicker_TimePicker_NumberPicker
- Android 三大图片缓存原理、特性对比
- Android学习笔记(27):日历视图Calendar
- android自定义View中getWidth和getHeight返回0
- Android快速开发--使用ORMLite操作数据库
- 【Android基础】setTextColor(),setBackgroundColor的参数设置方式
- Android学习笔记(26):Toast提示信息框
- 设计模式:模板方法
- Android BottomNavigationBar底部导航控制器使用方法详解
- Android5.0+(Percent 百分比布局)
- Android中使用Adapter和ListView的使用
- Android动态加载
- android shape.xml 文件使用
- Android 输入密码 隐藏显示输入的字符串
- android 上webService和rxjava结合使用
- Android App中ViewPager与Fragment结合的一些问题解决
- android之禁止黑屏和锁屏