AndroidStutio JNI/NDK开发(easy)

本文详细介绍了一个使用JNI技术在Android应用中调用C/C++代码的具体案例。包括如何搭建环境、配置Gradle、创建并编译本地代码,以及在Java层调用本地方法的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.新建一个类,单独管理加载so文件以及调用本地方法的类

package cinread.jj.jniexample;

/**
 * Created by pengjf on 2016/8/18.
 */
public class JniTest {
    static{
        System.loadLibrary("mobi_jj");
    }

    public native String stringFromJNI();
    public native String stringFromJNItwo();
}

2.gradle配置

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "cinread.jj.jniexample"
        minSdkVersion 16
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/libs']
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:19.1.0'
}

3.gradle.properties配置

android.useDeprecatedNdk=true

4.local.properties配置

sdk.dir=F\:\\work\\cinreadAdt\\sdk
ndk.dir=C\:\\androidndkr10e

5.Activity调用

package cinread.jj.jniexample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JniTest jt = new JniTest();
        TextView txtView = (TextView) findViewById(R.id.text);
        TextView txtView2 = (TextView) findViewById(R.id.text2);
        txtView.setText(jt.stringFromJNI());
        txtView2.setText(jt.stringFromJNItwo());
    }
}


二、重点

1.在main下新建jni目录

2.创建

             Android.mk 

LOCAL_PATH       :=  $(call my-dir)
include              $(CLEAR_VARS)
LOCAL_LDLIBS     := -llog                -- 非必需 代表mobi_jj.c中有LOG函数,其他必需
LOCAL_MODULE     :=  mobi_jj
LOCAL_SRC_FILES  :=  mobi_jj.c
include              $(BUILD_SHARED_LIBRARY)

             Application.mk  

APP_MODULES := mobi_jj
APP_ABI := armeabi armeabi-v7a x86         --单独填all,所有平台都生成so,单独写出来具体平台,就只生成具体的

            mobi_jj.c            --主要编写你的本地C代码,目前暂时举了2个传递字符串的例子


#include <android/log.h>
#include "cinread_jj_jniexample_JniTest.h"
#define LOG_TAG "libmobi_jj"
//
// Created by pengjf on 2016/8/18.
//
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

jstring Java_cinread_jj_jniexample_JniTest_stringFromJNI(JNIEnv* env, jobject thiz )
{
    LOGI("show my strings from JNI");
    return (*env)->NewStringUTF(env, "CinRead Mobi come on");
}
jstring Java_cinread_jj_jniexample_JniTest_stringFromJNItwo(JNIEnv* env, jobject thiz )
{
    LOGI("show my strings from JNI two");
    return (*env)->NewStringUTF(env, "CinRead Mobi come on two");
}
  

       3.javah生成头文件

在AS下打开Terminal,cd到包下,执行

javah cinread.jj.jniexample.JniTest
          javah 接你的包名+类名   生成了一个 cinread_jj_jniexample_JniTest.h 头文件,移动到jni目录下

4.在jni目录下打开cmd命令,执行ndk-build,生成了so文件并没有错误后,可以运行。(常见2个错误,请大家查阅相关资料)


三、结果展示,2个方法均传递了值









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值