ndk构建和.so文件创建android
我是新的android ndk。ndk构建和.so文件创建android
我工作的这需要Java代码以及C/C++代码
因此,一个应用程序,为我需要的Android NDK。
但我坚持在这一点上,我不能运行NDK建造这使得Java和C/C++之间的连接。
所以。请有人帮我解决这个问题。
我试过在Windows和Linux上,但得到同样的错误。
我得到这个错误,当我使用ndk构建。
/home/kamal/android-ndk-r8e/build/core/add-application.mk:128: Android NDK:
Compile thumb : ndk <= native.c
jni/native.c: In function 'Java_com_example_demo_MainActivity_hello':
jni/native.c:4:3: error: parameter name omitted
jni/native.c:4:3: error: parameter name omitted
jni/native.c:5:10: error: 'env' undeclared (first use in this function)
jni/native.c:5:10: note: each undeclared identifier is reported only once for each function it appears in
jni/native.c: In function 'Java_com_example_demo_MainActivity_add':
jni/native.c:9:3: error: parameter name omitted
jni/native.c:9:3: error: parameter name omitted
jni/native.c:9:3: error: parameter name omitted
jni/native.c:9:3: error: parameter name omitted
jni/native.c:10:9: error: 'value1' undeclared (first use in this function)
jni/native.c:10:18: error: 'value2' undeclared (first use in this function)
make: *** [obj/local/armeabi/objs/myjni/native.o] Error 1
首先你是因为你没有声明参数是必须创建Java和C/C++之间的连接如收到此错误。
所以,我送你我的代码为您的问题
所有1.首先在Eclipse中创建Android项目。
创建项目文件夹点击 - >点击新建 - >然后文件夹并命名为jni。
下JNI nameing再创建一个文件夹中包含。
创建java类。为java类nameing-(MainActivity.java)
-
代码 - >
package com.example.ndk; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { static { System.loadLibrary("myjni"); } /** * Adds two integers, returning their sum */ public native int add(int v1, int v2); /** * Returns Hello World string */ public native String hello(); @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
开放命令提示或按窗口+ R。
移动到目录 - (workspace->项目名称 - > JNI - >包括)。
-
在此目录下运行命令。
javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity
此后我们可以在include文件夹下看到“HelloJNI.h”文件。
-
检查 “HelloJNI.h” 有它的
JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add(JNIEnv *, jobject, jint, jint); JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello (JNIEnv *, jobject);
-
下创建JNI命名test.c的(在此文件test.c的使用蓬10这2个点)
新文件,该行#include <jni.h> #include "include/HelloJNI.h" JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello (JNIEnv *env, jobject javaThis) { return (*env)->NewStringUTF(env, "Hello"); } JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add (JNIEnv *env, jobject javaThis, jint value1, jint value2){ return (value1 + value2); }
-
创建命名的Android JNI下的新文件。MK
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := myjni // from point 5 LOCAL_SRC_FILES := test.c //from point 10 that we creare test.c include $(BUILD_SHARED_LIBRARY)
创建PROMT
在命令新文件NDKActivity.java
package com.example.ndk;
import android.app.Activity;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class NDKActivity extends Activity{
Button buttonCalc;
TextView result;
EditText value1,value2;
/** Called when the activity is first created. */
MainActivity nativeLib;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nativeLib = new MainActivity();
String helloText = nativeLib.hello();
result = (TextView) findViewById(R.id.result);
value1 = (EditText) findViewById(R.id.value1);
value2 = (EditText) findViewById(R.id.value2);
// Update the UI
TextView outText = (TextView) findViewById(R.id.textOut);
outText.setText(helloText);
// Setup the UI
buttonCalc = (Button)this.findViewById(R.id.buttonCalc);
buttonCalc.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int v1, v2, res = -1;
v1 = Integer.parseInt(value1.getText().toString().trim());
v2 = Integer.parseInt(value2.getText().toString().trim());
res = nativeLib.add(v1, v2);
result.setText(new Integer(res).toString());
}
});
}
}
运行NDK建造转到项目目录 - >然后,写这个命令<android-ndk-directory>\ndk-build.cmd
和点击进入
此后我们可以检查.so文件nder obj文件夹
-
xml file for NDKActivity。
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Vikram" android:textSize="22sp"/> <TextView android:id="@+id/textOut" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Output"/> <EditText android:id="@+id/value1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Value 1" android:inputType="numberDecimal" /> <TextView android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="+" android:textSize="36sp" /> <EditText android:id="@+id/value2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Value 2" android:inputType="numberDecimal" /> <Button android:id="@+id/buttonCalc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="=" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="result" android:textSize="36sp" /> </LinearLayout>
看起来这是在.h文件和.cpp文件中的函数不匹配。 您已经提到了在.h文件中的某些参数,这些参数在native.cpp文件中的实现中缺少。所有的
嘿格尔登,我搜索我的参数,但中号无法找到。 Thanx for reply –
感谢Vikram,它解决了我的问题 –
@Vikram ...当我尝试运行javah -classpath/bin/classes; \ platforms \ android- \ android.jar - HelloJNI.h com.example.test.MainActivity ......我在控制台“main”中得到这个异常java.lang.NullPointerException \t at sun.launcher.LauncherHelper.getMainClassFromJar(Unknown Source) \t at sun .launcher.LauncherHelper.checkAndLoadMain(Unknown Source) –
DJhon
不错的答案!谢谢你,兄弟!!!只需要修改一次Gradle项目。在第7点,我们应该使用 \ build \ intermediates \ classes \ debug(或发布)替换/bin/classes –
GrafOrlov