JNI编译so

JNI

原文地址:超级简单的Android Studio jni 实现(无需命令行)

1、生成.h文件

mark

Program: JDKPath J D K P a t h \bin\javah.exe
Parameters:-classpath . -jni -d ModuleFileDir M o d u l e F i l e D i r \src\main\jni FileClass F i l e C l a s s
Working directory: ModuleFileDir M o d u l e F i l e D i r \src\main\Java

注释:

-classpath classes 指明类所在的位置
-jni com.jni.jnitest.JNITest 类的绝对路径
-d 产生的.h文件放到指定目录下;

随便写个类调用一下JNI接口

public class JNITest {
    static {
        System.loadLibrary("JniLib");
    }
    public native String getString();
}

右键上面写的类,右键 src->New->Folder->JNI Folder

会在jni文件夹下面生成.h文件夹。

mark

2、创建文件 JniLib.cpp 、Android.mk、Application.mk

首先:创建jni文件夹

右键 src->New->Folder->JNI Folder

然后:在jni目录下分别创建并编写 JniLib.cpp、Android.mk、Application.mk这三个文件

  1. JniLib.cpp

    复制刚刚创建的.h文件内容到JniLib.cpp并修改,如下(此文件为JNI内容文件):

   /* DO NOT EDIT THIS FILE - it is machine generated */
   #include <com_ynh_mediaclient_mediaclient_JNITest.h>
   /* Header for class com_jni_jnitest_JNITest */
   /*
   * Class: com_jni_jnitest_JNITest
   * Method: getString
   * Signature: ()Ljava/lang/String;
   */
   JNIEXPORT jstring JNICALL
    Java_com_ynh_mediaclient_mediaclient_JNITest_getString //这里是路径
   (JNIEnv * env, jobject jobject)
   {
   return (*env).NewStringUTF("成功调用JNI内容");
   }
  1. Android.mk

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := JniLib
    LOCAL_SRC_FILES =: JniLib.cpp
    include $(BUILD_SHARED_LIBRARY)
  2. Application.mk

    APP_MODULES := JniLib //生成的so的名字 - 可以有很多个so
    APP_ABI := all   //生成什么平台的so.

总共四个文件

mark

3.其他配置

1.修改app下的 build.gradle文件, 如下

ndk{
moduleName "JniLib"
// abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定的三种abi体系下的so库
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
}

2.项目下的gradle.properties文件(如果没有此文件,自己新建一个)添加代码:

android.useDeprecatedNdk=true

4、执行ndk-build

用的是配置好的工具来执行,和第一步一样的条件

mark

选中JNI类右键->New->External Tools->ndk-build,然后就成功了。

5、调用so

写个类测试一下:

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

public class MainActivity extends AppCompatActivity {
    Button button;
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=(Button) findViewById(R.id.button);
        tv=(TextView) findViewById(R.id.tv);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv.setText("结果:"+ new JNITest().getString());
            }
        });
    }
}
}

效果图:

mark

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值