使用多个目录生成多个so库

在只生成一个so库的时候可以直接在jni目录下编写,但是需要使用多个so库的时候就需要每个库在对应目录下结构才比较清晰;

jni下的目录为:


其中:

Application.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
APP_PROJECT_PATH := $(call my-dir)/../
APP_MODULES      := libexpfirst libexpsecond

test-root-dir:=$(APP_PROJECT_PATH)jni/
Android.mk

include $(test-root-dir)ExpFirst/Android.mk
include $(test-root-dir)ExpSecond/Android.mk

在Application.mk文件中定义了test-root-dir变量指向的目录是$(APP_PROJECT_PATH)jni/,所以说,在Android.mk中就可以直接使用test-root-dir指向需要编译的Android.mk文件,进行编译到该Android.mk文件中的so模块;

jni/ExpFirst/Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libexpfirst
LOCAL_SRC_FILES := ExpFirst.cpp
include $(BUILD_SHARED_LIBRARY)
jni/ExpFirst/ExpFirst.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_com_test_ExpFirst */

#ifndef _Included_jni_com_test_ExpFirst
#define _Included_jni_com_test_ExpFirst
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jni_com_test_ExpFirst
 * Method:    getExpFirst
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_jni_com_test_ExpFirst_getExpFirst
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

jni/ExpFirst/ExpFirst.cpp

#include <jni.h>
#include<stdlib.h>
#include"ExpFirst.h"

JNIEXPORT jstring JNICALL Java_jni_com_test_ExpFirst_getExpFirst
  (JNIEnv *env, jobject obj){
	 jstring result = env->NewStringUTF("Hello ExpFirst2");
	 return result;
}
同理就不列出jni/ExpSecond/目录下的3个文件。

测试程序:

package jni.com.test;

public class ExpFirst {

	static{
		System.loadLibrary("expfirst");
	}
	public native String getExpFirst();
	
}

package jni.com.test;

public class ExpSecond {
	static{
		System.loadLibrary("expsecond");
	}
	public native String getExpSecond();
	
}

package com.example.mullibtest;

import jni.com.test.ExpFirst;
import jni.com.test.ExpSecond;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView1;
	private TextView textView2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView1 = (TextView) findViewById(R.id.textView1);
		textView2 = (TextView) findViewById(R.id.textView2);
		textView1.setText(new ExpFirst().getExpFirst());
		textView2.setText(new ExpSecond().getExpSecond());
	}

}

运行后生成:


还有另外一种方式编译两个及两个以上的so库:


其中源代码文件不变,只是Android.mk文件写法为:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libexpfirst
LOCAL_SRC_FILES := ExpFirst.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libexpsecond
LOCAL_SRC_FILES := ExpSecond.cpp
include $(BUILD_SHARED_LIBRARY)

依然同时编译出两个so库;

或者把它们分别放入各自的目录下:

只是修改的Android.mk文件中LOCAL_SRC_FILES加入目录而已:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libexpfirst
LOCAL_SRC_FILES := ExpFirst/ExpFirst.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libexpsecond
LOCAL_SRC_FILES := ExpSecond/ExpSecond.cpp
include $(BUILD_SHARED_LIBRARY)

均可以成功同时编译出2个so库;




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值