编译ndk生成.so
目的:仅仅只是简单的实用ndk生成.so文件
效果:点击按钮button,调用.so文件的内容
ndk版本:android-ndk-r16-beta1
项目目录 如图:
1.首先看下代码
MainActivity:
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.textview);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText(GetString.getNdkString()+"");
}
});
}
}
activity_main:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击获取"
/>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="dsds"
/>
</LinearLayout>
GetString:
public class GetString {
static {
System.loadLibrary("newso");
}
public static native String getNdkString();
}
2.生成GetString的.h文件,在java目录下执行: javah -cp sdk路径/sdk/platforms/android-29(可根据自己的修改)/android.jar:. 包名.类名,注意:.后面有个空格,
javah -cp ,例如: javah -cp /Users/machao/Library/Android/sdk/platforms/android-29/android.jar:. com.example.testso.GetString,执行之后会看到如下图:
3.在main目录下新建jni文件夹,将com_example_testso_GetString.h移动到jni目录下,并且编写Android.mk和Application.mk和ndkGetString.c:
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := newso
LOCAL_SRC_FILES := ndkGetString.c
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_ABI := all
ndkGetString.c
#include "com_example_testso_GetString.h"
JNIEXPORT jstring JNICALL Java_com_example_testso_GetString_getNdkString(JNIEnv *env, jobject thiz) {
return (*env)->NewStringUTF(env, "www.baidu.com");;
}
4.Terminal中,目录切换到jni下,执行:ndk目录/ndk-build,例如:
/Users/machao/ndk/android-ndk-r16-beta1/ndk-build
5.执行完成之后如下图:
6.在 main下新建jniLibs文件夹,将上图中libs中的.so文件复制进去
7.在app.gradle中:
8.可能会遇到的问题:
问题1:修改ndk版本,最好不要用studio自带的,我用的是android-ndk-r13b
问题2:在gradle.properties中加 android.useDeprecatedNdk=true