美文网首页Android JNI专题
第十一节(引入三方的so库)

第十一节(引入三方的so库)

作者: 最美下雨天 | 来源:发表于2017-10-03 18:52 被阅读19次

我们建两个工程来模拟一下这个过程:
1.在一个工程中生成所需so文件
2.将so文件导入到另外一个工程中
3.调用so里面的方法。

第一步

第一个工程中的代码:

image.png

看下生成的so文件:

image.png

第二步

我们修改下第二个工程默认的so文件的名称(因为用androidstudio新建的工程默认的so文件的名称都是native-lib)
CMakeLists.txt修改

cmake_minimum_required(VERSION 3.4.1)

#系统的
find_library(
              log-lib


              log )

 #设置so库路径
 set(my_lib_path ${CMAKE_SOURCE_DIR}/libs)
 #讲第三方库作为动态库引用
 add_library( native-lib
              SHARED
              IMPORTED )

 #指名第三方库的绝对路径
 set_target_properties( native-lib
                        PROPERTIES IMPORTED_LOCATION
                        ${my_lib_path}/${ANDROID_ABI}/libnative-lib.so )
 add_library(
             native2-lib


             SHARED


             src/main/cpp/native2-lib.cpp )





target_link_libraries(
                       native2-lib

                       native-lib


                       ${log-lib} )

第三步

1.导入so文件到第二个项目,放入libs下面
2.在build.gradle文件中的android标签下的defaultConfig下面写入:

 sourceSets.main {
            jniLibs.srcDirs = ['libs']
            jni.srcDirs = []
        }
image.png image.png

native2-lib.cpp

#include <jni.h>
#include "native-head.h"

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_huozhenpeng_myapplication_MainActivity_stringFromJNITest(JNIEnv *env,
                                                                          jobject instance, jint a,
                                                                          jint b) {

    return addFromJNI(a,b);//这儿调用的外部so库中的方法

}

package com.example.huozhenpeng.myapplication;

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

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native2-lib");
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(""+addFromJNI(10,29));
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native int addFromJNI(int a,int b);
}

调用测试:

image.png

相关文章

网友评论

    本文标题:第十一节(引入三方的so库)

    本文链接:https://www.haomeiwen.com/subject/sdwxyxtx.html