Android NDK编程

系统: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 __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"

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值