Android studio JNI 制作SO文件,在其他项目中调用

本文详细介绍了如何在Android Studio中利用JNI创建SO库文件,并阐述了生成SO文件后的调用过程,重点在于debug模式下的构建方法。

为了方便起见,制作这个so文件,我就直接用debug模式,在上一篇Android Studio中使用JNI 把初夜送给HelloWorld中介绍了jni的基本使用。

一、获取so文件

build完项目



然后自己就生成了so文件,位置在:


这些目录下,每个下面都会有so文件。区别在于不同设备,会调用不同包下面的文件。(这点我也不清楚,不浅学误人)
二、新建项目,将armeabi连同下面的so文件,放入项目的libs下。
java代码中调用。你可以把代码写成这样:
package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity2 extends AppCompatActivity {

    private TextView tv;
    static {
        System.loadLibrary("native-lib");
    }
    public native  String stringFromJNI();
    public native int getNum();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv =(TextView)findViewById(R.id.textView);
   //   MainActivity mc = new MainActivity();
   //   mc.put();
        tv.setText(""+getNum());
    }
}
运行看看,结果发现:

java.lang.UnsatisfiedLinkError: No implementation found for....
我完了一早上看这是个啥问题,最后才得出结论, 调用这个方法,包名、类名必须要和C代码中方法一致,否则调不到。
所以,我新建了个包,建了个类。在另外一个类中调用。
package com.example.administrator.myapplication;

/**
 * Created by fireMorning on 2017/3/2 0002.
 */

public class MainActivity {
    public native  String stringFromJNI();
    public native int getNum();
    public void put(){
        System.out.println("firefox++++++++++++"+getNum());
    }
    public String get(){
        return stringFromJNI();
    }
}
当然,别好奇我这个命名,只是为了说明问题。这不是activity,而是普通类。而在activity中,
package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity2 extends AppCompatActivity {

    private TextView tv;
    static {
        System.loadLibrary("native-lib");
    }
    public native  String stringFromJNI();
    public native int getNum();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv =(TextView)findViewById(R.id.textView);
        MainActivity mc = new MainActivity();
        mc.put();
        tv.setText(""+mc.get());
    }
}

另外,public native  String stringFromJNI();
      public native int getNum();
这两句代码报红,别理他。只要你自己确认无误就可以直接编译了。

附上代码:点击下载
(真不好意思,这么个东西,居然要1分,因为我实在没下载币了)


  





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值