android studio 依赖 包.so找不到,Android Studio – 找不到本机方法 – 在构建中包含.so文件...

我从NDK开始,想用它编译我的第一个hello-world应用程序.

我的应用程序只是一个带有Activity的简单应用程序,而我的MainActivity是在com.example.myapplication2.app中

我想在其中使用本机方法,这就是我所做的:

MainActivity.java

@Override

protected void onCreate(Bundle savedInstanceState) {

TextView tv = new TextView(this);

tv.setText(stringFromJNI());

setContentView(tv);

}

public native String stringFromJNI();

static {

System.loadLibrary("hello-jni");

}

在我的jni文件夹中:

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni

LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI := all

你好,jni.c

#include

#include

JNIEXPORT jstring JNICALL Java_com_example_myapplication2_app_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz)

{

return (*env)->NewStringUTF(env, "Hello from native code!");

}

在这里,我的朋友:

apply plugin: 'android'

android {

compileSdkVersion 19

buildToolsVersion "19.0.3"

defaultConfig {

minSdkVersion 8

targetSdkVersion 19

versionCode 1

versionName "1.0"

}

buildTypes {

release {

runProguard false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

}

}

sourceSets.main {

jniLibs.srcDir 'src/main/libs'

jni.srcDirs = [] //disable automatic ndk-build call

}

productFlavors {

x86 {

versionCode Integer.parseInt("6" + defaultConfig.versionCode)

ndk {

abiFilter "x86"

}

}

mips {

versionCode Integer.parseInt("4" + defaultConfig.versionCode)

ndk {

abiFilter "mips"

}

}

armv7 {

versionCode Integer.parseInt("2" + defaultConfig.versionCode)

ndk {

abiFilter "armeabi-v7a"

}

}

arm {

versionCode Integer.parseInt("1" + defaultConfig.versionCode)

ndk {

abiFilter "armeabi"

}

}

fat

}

}

def getVersionCodeFromManifest() {

def manifestFile = file(android.sourceSets.main.manifest.srcFile)

def pattern = Pattern.compile("versionCode=\"(\\d+)\"")

def matcher = pattern.matcher(manifestFile.getText())

matcher.find()

return Integer.parseInt(matcher.group(1))

}

task copyNativeLibs(type: Copy, dependsOn: 'buildNative') {

// TODO fix deprecated

dependsOn 'buildNative'

from(new File('src/main/libs')) { include '**/*.so' }

into new File(buildDir, 'native-libs')

}

tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->

pkgTask.jniFolders = new HashSet();

pkgTask.jniFolders.add(new File(projectDir, 'native-libs'))

}

task buildNative(type: Exec) {

if (System.env.ANDROID_NDK != null) {

def ndkBuild = new File(System.env.ANDROID_NDK, 'ndk-build')

workingDir "src/main/jni"

commandLine 'cmd', '/c', '%ANDROID_NDK%\\ndk-build'

//executable ndkBuild

} else {

doLast {

println '##################'

println 'Skipping NDK build'

println 'Reason: ANDROID_NDK not set.'

println '##################'

}

}

}

task nativeLibsToJar(

type: Zip,

description: 'create a jar archive of the native libs') {

destinationDir file("$buildDir/native-libs")

baseName 'native-libs'

extension 'jar'

from fileTree(dir: 'libs', include: '**/*.so')

into 'lib/'

}

dependencies {

compile 'com.android.support:appcompat-v7:+'

compile fileTree(dir: 'libs', include: ['*.jar'])

}

当我想运行我的项目时,我没有C错误(我之前有过,这就是为什么我确定编译完成了,然后确定).

但是,当我想运行应用程序时,我有错误:

java.lang.UnsatisfiedLinkError: Native method not found: com.example.myapplication2.app.MainActivity.stringFromJNI:()Ljava/lang/String;

> com.example.myapplication2.app.MainActivity.stringFromJNI和Java_com_example_myapplication2_app_MainActivity_stringFromJNI匹配

> extern“C”不存在,因为当我使用它时,我遇到了这个错误:Error: “expected ‘(‘ before string constant”

你知道为什么我会遇到这个错误吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值