Android NDK编程

来源:互联网 发布:h3c配置vlan多个端口 编辑:程序博客网 时间:2024/05/16 07:53

系统: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项目

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 __cplusplusextern "C" {#endifvoid 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-testLOCAL_SRC_FILES := test.cppinclude $(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"

0 0
原创粉丝点击