jni 学习demo

只是为了记录学习成长

代码在附件

//找到对应的JNITools类luo/
// com.luo.administrator.jnidemo4;
jclass jClassName=(*env)->FindClass(env,“com/luo/administrator/jnidemo4/JNITool”);
路径写错会加载不到库,找不到库

//开始注册
jint ret = (*env)->RegisterNatives(env,jClassName,method, 2);

2是方法数,如果写错会报空指针错。报错地址是0x0 因为注册的时候报错的,所以就不用反编译看哪个地址的函数了。下面是错误log

11-14 19:31:04.905 3603 3642 I bt_btif_a2dp_sink: btif_a2dp_sink_audio_handle_start_decoding
11-14 19:31:05.338 17225 17225 D JNITag : enter jni_onload
11-14 19:31:05.339 17225 17225 F libc : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4ddddc492fc960 in tid 17225 (trator.jnidemo4), pid 17225 (trator.jnidemo4)
11-14 19:31:05.403 17274 17274 E DEBUG : failed to readlink /proc/17225/fd/66: No such file or directory
11-14 19:31:05.404 17274 17274 E DEBUG : failed to readlink /proc/17225/fd/67: No such file or directory
11-14 19:31:05.435 17274 17274 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstone
11-14 19:31:05.437 399 399 I /system/bin/tombstoned: received crash request for pid 17225
11-14 19:31:05.441 17274 17274 I crash_dump64: performing dump of process 17225 (target tid = 17225)
11-14 19:31:05.473 17274 17274 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-14 19:31:05.473 17274 17274 F DEBUG : Build fingerprint: ‘AURA/Air_Line_AC5/Air_Line_AC5:9/PQ3A.190505.002/ron11112126:userdebug/dev-keys’
11-14 19:31:05.473 17274 17274 F DEBUG : Revision: ‘0’
11-14 19:31:05.473 17274 17274 F DEBUG : ABI: ‘arm64’
11-14 19:31:05.473 17274 17274 F DEBUG : pid: 17225, tid: 17225, name: trator.jnidemo4 >>> com.luo.administrator.jnidemo4 <<<
11-14 19:31:05.473 17274 17274 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4ddddc492fc960

核心几个部分代码:

package com.luo.administrator.jnidemo4;

import android.app.Activity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class JNITestActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jnitest);
        Button bt1_add = findViewById(R.id.add);
        Button bt1_sub = findViewById(R.id.sub);
        final EditText inputa = findViewById(R.id.inputa);
        final EditText inputb = findViewById(R.id.inputb);
        final TextView rest = findViewById(R.id.result);



        bt1_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                double result = 0;
                String strA = inputa.getText().toString();
                String strB = inputb.getText().toString();
                int a = Integer.parseInt(strA);
                int b = Integer.parseInt(strB);
                result = JNITool.add(a,b);
                rest.setText(""+result);

            }
        });

        bt1_sub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                double result = 0;
                String strA = inputa.getText().toString();
                String strB = inputb.getText().toString();
                int a = Integer.parseInt(strA);
                int b = Integer.parseInt(strB);
                result = JNITool.sub(a,b);
                rest.setText(""+result);

            }
        });
    }
}
package com.luo.administrator.jnidemo4;

/**
 * Created by Administrator on 2019/11/14 0014.
 */

public class JNITool {

    static {

        System.loadLibrary("jnidemo4");

    }
    //加法
    public static native int  add(int a,int b);

    //减法
    public static native int sub(int a,int b);
}
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>

jint addNumber(JNIEnv *env,jclass clazz,jint a,jint b);
jint subNumber(JNIEnv *env,jclass clazz,jint a,jint b);



JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){

    //打印日志,说明已经进来了
    __android_log_print(ANDROID_LOG_DEBUG,"JNITag","enter jni_onload");

    JNIEnv* env = NULL;
    jint result = -1;

    // 判断是否正确
    if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_6)!= JNI_OK){
        return result;
    }

    //注册四个方法,注意签名
    const JNINativeMethod method[]={
            {"add","(II)I",(void*)addNumber},
            {"sub","(II)I",(void*)subNumber},
           // {"mul","(II)I",(void*)mulNumber},
          //  {"div","(II)I",(void*)divNumber}
    };

    //找到对应的JNITools类luo/
 //   com.luo.administrator.jnidemo4;
    jclass jClassName=(*env)->FindClass(env,"com/luo/administrator/jnidemo4/JNITool");

    //开始注册
    jint ret = (*env)->RegisterNatives(env,jClassName,method, 2);

     //如果注册失败,打印日志
    if (ret != JNI_OK) {
        __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "jni_register Error");
        return -1;
    }

    return JNI_VERSION_1_6;
}


jint addNumber(JNIEnv *env,jclass clazz,jint a,jint b){
     return a+b;
}

jint subNumber(JNIEnv *env,jclass clazz,jint a,jint b){
     return a-b;
}
这个build.gradle 很关键
apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.luo.administrator.jnidemo4"
        minSdkVersion 27
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk{
            moduleName "jnidemo3"
            abiFilters 'x86','armeabi-v7a','arm64-v8a'
            ldLibs "log"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
    sourceSets.main {
        jni.srcDirs = [ ]
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

效果图在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当您在Java程序中需要调用C/C++代码时,可以使用Java Native Interface(JNI)来实现。下面是一个简单的JNI示例,演示了如何将Java方法与C函数相互调用: 1. 创建一个Java类,例如"JNIDemo.java",其中包含您想要调用的本地方法: ```java public class JNIDemo { // 本地方法声明 public native void sayHello(); // 加载本地库 static { System.loadLibrary("jni_demo"); // 加载名为"jni_demo"的本地库 } // 测试 public static void main(String[] args) { JNIDemo demo = new JNIDemo(); demo.sayHello(); // 调用本地方法 } } ``` 2. 在命令行中使用`javac`编译Java类:`javac JNIDemo.java`。 3. 生成C头文件,可以使用`javah`工具:`javah JNIDemo`。这将生成名为"JNIDemo.h"的头文件。 4. 创建一个C源文件,例如"jni_demo.c",实现您在Java中声明的本地方法: ```c #include <stdio.h> #include "JNIDemo.h" JNIEXPORT void JNICALL Java_JNIDemo_sayHello(JNIEnv *env, jobject obj) { printf("Hello from C!\n"); } ``` 5. 在命令行中使用C编译器编译C源文件,并生成共享库文件(DLL或SO): - 对于Windows(使用MinGW):`gcc -shared -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" jni_demo.c -o jni_demo.dll` - 对于Linux/Mac:`gcc -shared -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" jni_demo.c -o libjni_demo.so` 注意:请将`$JAVA_HOME`替换为您Java安装的实际路径。 6. 运行Java程序:`java JNIDemo`。您将看到输出:"Hello from C!"。 这是一个简单的JNI示例,演示了如何在Java和C之间进行方法调用。您可以根据自己的需求扩展和定制此示例。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值