在只生成一个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库;