ndk (一)

1 篇文章 0 订阅
// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Example of a call to a native method
    TextView tv = (TextView) findViewById(R.id.sample_text);
    int []iArr = {1, 2, 5, 6, 9, 8, 9};
    String []strArr = {"linux", "rehat", "debian" ,"ubuntu"};
    tv.setText(stringFromJNI2(this,"ubuntu"));
}

/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 */
public native String stringFromJNI();

public native String stringFromJNI1(int[] iArr, String [] strArr);

public native String stringFromJNI2(Activity iArr, String strArr);


public int getIndex() {
    return index;
}

public void setIndex(int index) {
    this.index = index;
}

int index=100;


static void showText(String jniStr){

    Log.e("chris",jniStr);

}
cmake_minimum_required(VERSION 3.4.1)

add_library(
        native-lib
        SHARED
        src/main/cpp/native-lib.cpp
        src/main/cpp/code/Animal.cpp
              )
find_library(
              log-lib
              log )
target_link_libraries(
                       native-lib
                       ${log-lib} )
#include <jni.h>
#include <string>
#include "header/Animal.h"
#include <android/log.h>

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"JNI",__VA_ARGS__)
using namespace std;
extern "C"
JNIEXPORT jstring JNICALL
Java_com_api_open_democ_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    string hello = "Hello from C++";
    Animal *animal = new Animal;
    animal->showName();
    delete animal;
    return env->NewStringUTF(hello.c_str());
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_api_open_democ_MainActivity_stringFromJNI1(JNIEnv *env, jobject instance, jintArray iArr_,
                                                    jobjectArray strArr_) {
    jint *iArr = env->GetIntArrayElements(iArr_, NULL);

    jsize len = env->GetArrayLength(iArr_);

    for (int i = 0; i < len; ++i) {
        __android_log_print(ANDROID_LOG_ERROR, "JNI", "%d", *(iArr + i));
    }

    //0 刷新数组  释放数组
    // 1 只刷新数组
    // 2  释放数组  对Java层没影响
    env->ReleaseIntArrayElements(iArr_, iArr, 0);

    int str_len = env->GetArrayLength(strArr_);
    for (int i = 0; i < str_len; ++i) {
        jstring str = (jstring) env->GetObjectArrayElement(strArr_, i);
        const char *s = env->GetStringUTFChars(str, 0);
        LOGE("获得的java参数是:%s", s);
        env->ReleaseStringUTFChars(str, s);
    }

    return env->NewStringUTF("hello world");
}extern "C"
JNIEXPORT jstring JNICALL
Java_com_api_open_democ_MainActivity_stringFromJNI2(JNIEnv *env, jobject instance, jobject jobject_,
                                                    jstring str_) {

    const char *str = env->GetStringUTFChars(str_, 0);
    // TODO

    //1、获取类对象
    jclass activityCls = env->GetObjectClass(jobject_);
    //2、通过签名获取方法  参数  类对象 方法名  签名 (参数  返回类型)
    jmethodID getIndex = env->GetMethodID(activityCls, "getIndex", "()I");
    //3、调用方法
    env->CallIntMethod(jobject_, getIndex);


    jmethodID setIndex = env->GetMethodID(activityCls, "setIndex", "(I)V");
    env->CallVoidMethod(jobject_, setIndex, 100);

   jmethodID showText = env->GetStaticMethodID(activityCls,"showText" ,"(Ljava/lang/String;)V");
    jstring str2=env->NewStringUTF("我是静态方法,被C++调用");
    env->CallStaticVoidMethod(activityCls,showText,str2);

    //释放局部引用
    env->DeleteLocalRef(str2);
    env->ReleaseStringUTFChars(str_, str);
    return env->NewStringUTF(str);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值