Android Studio 1.0 JNI 引用多个C++文件编译找不到类的问题

ameyume
博客专家认证
2015-12-09 12:21:34
--------------- 前提条件 ---------------
1. NDK版本:android-ndk-r10d

2.JNI目录:
app/src/main/jni$ ls
Android.mk
com_ameyume_TestJni.h
com_ameyume_TestJni.cpp

abc.h
Abc.cpp

3. Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := test_jni
LOCAL_LDLIBS := \
-llog \

LOCAL_SRC_FILES := \
/home/ameyume/testproject/TestJni/app/src/main/jni/Abc.cpp \
/home/ameyume/testproject/TestJni/app/src/main/jni/com_ameyume_TestJni.cpp \

LOCAL_C_INCLUDES += /home/ameyume/testproject/TestJni/app/src/main/jni
LOCAL_C_INCLUDES += /home/ameyume/testproject/TestJni/app/src/debug/jni

include $(BUILD_SHARED_LIBRARY)


--------------- 问题 ---------------
在com_ameyume_TestJni.cpp文件中引用了Abc类,已经引入头文件
#include "abc.h"
编译时,提示找不到类Abc
error: 'Abc' does not name a type

如果注释掉引用Abc类的地方,怎可以编译通过。
无论是使用ndk-build还是用Android Stuido 的build make模块app都会报同样的错误。

300分跪求指导Orz
...全文
460 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanxiaochengyu 2015-12-09
  • 打赏
  • 举报
回复
。。。好吧,你已经解决好了
sanxiaochengyu 2015-12-09
  • 打赏
  • 举报
回复
gradle.properties下加了这个没有 android.useDeprecatedNdk=true

sourceSets.main {
        jniLibs.srcDir 'src/main/jni'
        jni.srcDirs = [] //disable automatic ndk-build call
    }
    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
 
            commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
 
    }
 
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
这几段注释掉看看可以运行么
ameyume 2015-12-09
  • 打赏
  • 举报
回复
原因找到了,是因为我的C++类是从源码中拷贝的,带了namespace android,去掉就好了。 不需要命名空间。
ameyume 2015-12-09
  • 打赏
  • 举报
回复
非常感谢各位: 模块的build.gradle如下,已经添加了moduleName
apply plugin: 'com.android.library'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        /* required */
        /**
         * current ndk support is deprecated
         * wait for the new gradle ndk support from google
         * and call ndk-build from command line to solve jni compile
         */
        ndk {
            moduleName "media_jni"  // 你的 ndk 模块名字, JNI调用的时候需要load它 System.loadLibrary("media_jni");
            ldLibs "log"            // log模块是必须的
            stl "stlport_static"    // Use static stlport library
            abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets.main {
        jniLibs.srcDir 'src/main/jni'
        jni.srcDirs = [] //disable automatic ndk-build call
    }
    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {

            commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath

    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
参考了:android studio编译C++问题
sanxiaochengyu 2015-12-09
  • 打赏
  • 举报
回复
放在 defaultConfig{} 内
sanxiaochengyu 2015-12-09
  • 打赏
  • 举报
回复
如楼上说的 Android.mk 在AS中是没有用的 还是看看你module 下面build.gradle 的有没有设置 ndk { moduleName = "xxxx" //设置库(so)文件名称 }
jklwan 2015-12-09
  • 打赏
  • 举报
回复
现在还用1.0版本的as呢,我没有用过这个版本。 1、r10d这个ndk版本是有bug的,换r10e试试。 2、as并没用到jni下的android.mk文件,他是在build.gradle中设置的。 如果可以的话发下demo。

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧