我们建两个工程来模拟一下这个过程:
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 = []
}
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
网友评论