现在手机主流CPU架构一般是2种:
32位对应-armeabi-v7a
64位对应-arm64-v8a
下面进入正题,Android Studio版本是4开头的,具体多少没显示....
1,首先在AS里面下载好NDK和CMAKE,如下图:
2,用AS新建一个支持Native C++的项目,如果新建完项目,等build完成可以直接跑起来,说明你环境没问题,完全可以玩起来,新版本的AS都不用配置NDK目录啥的,这很智能,旧版的同学赶紧升级吧。
3,下面是我自己新建的项目,我们修改下AS自建的代码,达成演示的效果,
目标是java传入2个整数,通过C++或C代码计算和。
C代码如下,C的方法命名规则是Java_包名_类名_方法名:
// // Created by 13746 on 2022/8/8. // #includeJNIEXPORT jint JNICALL Java_com_example_nativedemo_NumNative_getSumFromC( JNIEnv* env, jobject obj, jint age, jint high ) { return age+high; }
native方法加载so 和java调用:
package com.example.nativedemo; public class NumNative { static { System.loadLibrary("num"); } public native int getSumFromC(int age,int high); }
package com.example.nativedemo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import com.example.nativedemo.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; private NumNative numNative; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); TextView tv = binding.sampleText; numNative = new NumNative(); int sumFromC = numNative.getSumFromC(100, 203); tv.setText("获取到结果:"+sumFromC); } }
运行结果:
上面是C源文件经过编译后直接运行的,那么打包出来的so文件在哪,别的项目怎么使用这个so文件呢?下面具体说说。
生成的so文件目录如下拷贝出来就可以给别人使用了:
下面是别的项目使用这个so文件运行结果,写的类NativeNum必须要和生成so文件包名相同。
使用的项目里面build文件里面需要设置如下,但是编译的项目不能设置,否则会报错
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
NumNative类合Main
package com.example.nativedemo; public class NumNative { static { //此处加载so文件不要带有前缀lib,和后缀名 .so,系统自动加 System.loadLibrary("num"); } public native int getSumFromC(int age,int high); }
package com.example.nativedemo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private NumNative numNative; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); numNative = new NumNative(); TextView sum = findViewById(R.id.mainSum); int sumFromC = numNative.getSumFromC(33, 180); sum.setText("获取的结果:"+sumFromC); } }
下面是2个项目的完整代码地址:
晚点上传