平台: windows
IDE: android studio 3.1.4
ndk :android-ndk-r10e
1.新建一个Android studio工程。 新建一个 AlgJni.java文件.
AlgJni.java
public class AlgJni {
static {
System.loadLibrary("JniAlg");
}
public native static String GetSm3HashHex(String filePath);
}
2. make project , 会在app的build 目录中生成 AlgJni.class 文件
3. 在app/src/main 文件下新建一个 jni 文件夹, android studio 终端, cd到jni 目录, 输入如下命令
javah -jni -classpath D:\JniAlg\app\build\intermediates\classes\debug
com.example.administrator.jnialg.AlgJni
会在jni文件中生成一个jni头文件, 在当前文件夹中(jni)中生成.c文件并对它进行实现; 在当前文件夹下新建一个Android.mk和Application.mk:
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniAlg
LOCAL_SRC_FILES := com_example_administrator_jnialg_AlgJni.c
LOCAL_SRC_FILES += sm3.c
LOCAL_SRC_FILES += sm3_.c
include $(BUILD_SHARED_LIBRARY)
Application.mk:
APP_ABI := all
4.ndk 配置;
终端进入jni目录, 输入: ndk-build就会生成so文件.
5.调用so文件.
app中的build.gradle文件中添加入下:
android {
...
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
}
MainActivity中调用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(AlgJni.GetSm3HashHex("/sdcard/Download/test.txt"));
}
}
layout中入如下:
运行效果: